首页 > 代码库 > 编程模式如何结束未响应的程序

编程模式如何结束未响应的程序

有时要编程结束一个程序的运行。
比如说 hWnd  是你要操作的那个窗口的句柄。

如果是一般的情况
::PostMessage(hWnd,WM_CLOSE,0,0);
就可以了。
(注意不要发送 WM_DESTROY消息。
这两者有什么区别呢?WM_CLOSE,会正常关闭程序,比如说,如果是WORD文件未保存,系统会提示你是否要保存的。
而 WM_DESTROY 则不会给你任何提示,就强行结束了。)

但如果是失去响应的应用程序,不论是WM_CLOSE还是WM_DESTROY都无能为力,因为该隔膜泵程序已经不再处理任何消息啦!这时,可以采用下面的代码:

    if( IsHungAppWindow( hWnd ) )   
    {
     DWORD id=0;
     ::GetWindowThreadProcessId(hWnd,&id);
       HANDLE   ps   =   OpenProcess(1,false,id);
       if(   ps   &&   TerminateProcess(ps,-9))
            WriteLog(L"结束未响应的窗口,成功");
       else
            WriteLog(L"结束未响应的窗口,失败");
    }

代码不用解释了吧?有点vc基础的都看得懂。
本来想绑定wap子域名的,不过IDC不提供这个功能。真是晕死!
难道为了反色情,就要禁止绑定wap子域名吗?

wap编程有很多不同。比如说,至少要包含一个form,而且,里面的隔膜泵控件,必须要是 <mobile:TextBox> <mobile:form> 这样的形式的。

别的有很多功能是不支持的。比如我想配置文本的背景色却不能成功哦
好不容易找到的,放在这儿备查!
以发送Ctrl+P为例,hWnd是接受消息的窗口句柄,

   keybd_event(   VK_CONTROL,0,0,0   );  
   ::PostMessage(   hWnd,   WM_KEYDOWN,   ‘P‘,0);    
   Sleep   (30);  
   ::PostMessage(   hWnd,   WM_KEYUP,   ‘P‘,0);  
   keybd_event(   VK_CONTROL,0,KEYEVENTF_KEYUP,0   );
怎么获得具有输入焦点的子窗口句柄?这个问题看似简单,却困惑了很多有经验的程序员。
下面我把问题分解一下。
1,获得本进程具有输入焦点的子窗口句柄
     GetFoucus
2,获得系统中的当前窗口
    GetForegroundWindow
但要怎么获得整个系统中具有输入焦点的的窗口呢?看下面代码

    CWnd *pWnd = GetForegroundWindow();
                http://www.it168.com/
                if( pWnd )
                {

                    DWORD dwThread = ::GetWindowThreadProcessId(pWnd->m_hWnd,NULL);
                    AttachThreadInput(dwThread, GetCurrentThreadId(), TRUE);
                    // 获取焦点窗口句柄
                    HWND hFocus = ::GetFocus();
                    // 解除贴附
                    AttachThreadInput(dwThread, GetCurrentThreadId(), FALSE);
                     }