有时要编程结束一个程序的运行。
比如说 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);
}
本文介绍如何关闭Windows 7/Vista/XP中的未响应程序,尽管Windows 7在程序容错性方面做了很大改进,但未响应程序及死机情况还是会经常遇到,这类问题各有原因,系统、软件和硬件都有责任,遇到未响应程序时,耐心先等待一下,实在不行就强制重启计算机,但要注意先备份好当前打开的数据,因为结束进程还可能导致系统死机、自动重启等现象,尤其是些跟硬件关联的程序。
一、手动关闭未响应程序
1、任务管理器中手动关闭
在任务栏上空白地方,点击鼠标右键,选择启动任务管理器(或在开始运行输入task,并按下回车键)。如何判断进程名?可以参照任务管理器中的应用程序选项卡中的未响应程序名,找到该程序然后再鼠标右键选择转到进程,Windows 7会自动帮你跳到该程序对应的进程项目。
选中未响应程序的进程名,然后点击结束进程并确认(如下图)。不过在结束进程前,需要注意以下两项:
请再次确认该未响应程序是否涉及需要保存的重要数据,比如文档、剪切板等数据,请在结束之前尽可能的尝试先保存数据。
结束进程不排除会导致死机、自动重启现象,所以其它进程如果正在运行重要数据也需要保持,清场后再尝试结束进程,放置扩大影响。
不过该方法结束进程也经常不太奏效,再尝试在该进程上鼠标右键选择“结束进程树”,如果还不行可以尝试下面的命令行方式。
2、命令行方式结束未响应程序
以管理员权限打开CMD命令行:
在命令行窗口输入:taskkill /F /FI “STATUS eq NOT RESPONDING并回车确认即可结束未响应程序。
不过即使这样,有部分与硬件相关的程序还是可能难以关闭,比如光驱、打印机等,因为操作系统可能正同硬件交互数据,遇到这类情况,要么是多等待一下,或者强制弹出光驱或断电打印机,要么就是强制关机重启了。
二、设置系统自动关闭未响应程序
自动关闭未响应程序是系统自动完成的,由于Vista/Windows 7在程序执行效率的缘故,很多未响应的程序其实并没死,而完全是因为操作系统的调度引起的“暂停”状态,尤其是很多电脑老手,鼠标操作太快,程序运行和切换已经完全超出操作系统的响应速度,那样很容易造成暂时的假死状态。
比如系统繁忙时运行某些程序、光驱由于光盘质量问题的频繁读写等等情况,一般只需要耐心等待一下,程序就会恢复状态,而在恢复之前,系统则是一直报告未响应的程序(因为线程或进程超时)。所以还是慎用自动关闭未响应程序。
1、在Windows XP系统上,如需设置自动关闭未响应程序,参考以下方法:
在开始运行中输入regedit并回车
定位到HKEY_CURRENT_USERControl PanelDesktop
设置AutoEndTasks键值为1,如果没有可以手动创建一个名为 AutoEndTasks 类型为REG_SZ值为1的表项。
2、在Vista和Windows 7上,参照以下方法:
在开始运行中输入regedit并回车
定位到HKEY_CURRENT_USERControl PanelDesktop
设置AutoEndTasks键值为1,如果没有可以手动创建一个名为 AutoEndTasks 类型为REG_SZ值为1的表项。
WaitToKillAppTimeout是超时等待时间,默认值12000,这个值在很多网站上建议修改短一点,这里不推荐,最好不要改。因为程序的运行是综合的,影响超时的时间会很多,太短的超时时间可能会带来一些“莫名其妙”的问题。
如确认修改WaitToKillAppTimeout,请统一修改:
HKEY_CURRENT_USERControl PanelDesktop
HKEY_LOCAL_MACHINESYSTEMControlSet001Control
HKEY_LOCAL_MACHINESYSTEMControlSet002Control
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl
下的WaitToKillAppTimeout,比如1000,2000均可以。