判断一个窗口是否被挂起(发WM_NULL消息,或者调用IsHungAppWindow API进行测试)
判断一个窗口是否被挂起了(就是没有响应了),在多窗口编程了经常会用到,在给别的窗口发消息前,为了目的窗口能确定收到消息,常常在之前先检测窗口是否被挂起了,我们以前常用的方式的是使用下面的方法:
- // 判断一个窗口是否已经停止响应了(超时0.5秒)
 - DWORD_PTR dwResult = 0;
 - LRESULT lr = ::SendMessageTimeout(g_hWin, WM_NULL, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult);
 - if (lr)
 - {
 - // 还可以响应
 - }
 - else
 - {
 - // 已经停止响应了(俗话说的窗口挂死了)
 - }
 
后来在(http://blog.csdn.net/wingeek/article/details/3875903)看到一种使用IsHungAppWindow这个API来直接判断窗口是否挂起的的方法,从MSDN上面看(http://msdn.microsoft.com/en-us/library/ms633526.aspx),这个API从windows2000就已经开始提供了,但是直到windowsxp_sp1和windows2003开始才提供了SDK。开始猜测是不是内部就是使用SendMessageTimeout实现,实时跟踪了下,发现不是。下面就是IsHungAppWindow的实现代码:
77D69C61 >  8BFF            MOV EDI,EDI
      77D69C63    55              PUSH EBP
      77D69C64    8BEC            MOV EBP,ESP
      77D69C66    6A 04           PUSH 4
      77D69C68    FF75 08         PUSH DWORD PTR SS:[EBP+8]
      77D69C6B    E8 6BEAFAFF     CALL USER32.77D186DB
      77D69C70    F7D8            NEG EAX
      77D69C72    1BC0            SBB EAX,EAX
      77D69C74    F7D8            NEG EAX
      77D69C76    5D              POP EBP
      77D69C77    C2 0400         RETN 4
77D186DB    B8 E3110000     MOV EAX,11E3
      77D186E0    BA 0003FE7F     MOV EDX,7FFE0300
      77D186E5    FF12            CALL DWORD PTR DS:[EDX] ; ntdll.KiFastSystemCall
      77D186E7    C2 0800         RETN 8
在IsHungAppWindow内部其实很简单,调用了USER32.77D186DB这个函数,这个函数其实就是NtUserQueryWindow(从后面可以看出77D186DB内部直接就调往内核了调用了,功能号EAX是11E3),其中7FFE0300既是KiFastSystemCall的地址,在看调用NtUserQueryWindow的地方,Push了两个参数,也就是NtUserQueryWindow(hwnd, 4),第一个参数是目的窗口的句柄,第二个参数是查询ID,也就是标明想查这个窗口的什么信息,4代表是查这个窗口是否挂起了,直接由ring0来实现了……
http://blog.csdn.net/magictong/article/details/7296250
判断一个窗口是否被挂起(发WM_NULL消息,或者调用IsHungAppWindow API进行测试)的更多相关文章
- 对TControl和TWinControl相同与不同之处的深刻理解(每一个WinControl就相当于扮演了整个Windows的窗口管理角色,主要是窗口显示和窗口大小)——TWinControl就两个作用(管理子控件的功能和调用句柄API的功能)
		
TControl是图形控件,它本身没有句柄,所以不能直接使用WINAPI显示,调整位置,发消息等等,只能想办法间接取得想要的效果,但是可以直接使用一些不需要句柄的API,比如InvalidateRec ...
 - OpenGL判断一个点是否可见
		
关于OpenGL中判断一个点是否可见,可以分成两种情况讨论:点在2D空间中和3D空间中的时候.并且"在2D空间中"可以看作"在3D空间中"的特殊情况. 温馨提示 ...
 - 怎样判断一个P2P平台是否靠谱?
		
判断一个网站,是否靠谱,是有规律可循的,P2P平台算是个新兴的电商类网站. 网上欺诈类的网站,不限于P2P,实在是太多了,真的有必要总结下最关键的几个靠谱指标. 最关键的2个 1.创始人和 ...
 - 2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
		
原文:2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见 title author date CreateTime categories win10 uwp 如何判断一 ...
 - 2019-4-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
		
title author date CreateTime categories win10 uwp 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-04-29 10:40:33 + ...
 - Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)
		
Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...
 - excel批处理_判断一个名称是不是药品
		
把药品名称导入到sheet1的A字段 # -*- coding: utf-8 -*-"""Created on Fri Dec 9 09:38:58 2016判断一个名 ...
 - pywin32 创建一个窗口
		
import win32con,win32gui class MyWindow(): def __init__(self): #注册一个窗口类 wc = win32gui.WNDCLASS() wc. ...
 - 判断一个字符串str不为空的方法
		
1.str == null; 2."".equals(str); 3.str.length 4.str.isEmpty(); 注意:length是属性,一般集合类对象拥有的属性,取 ...
 
随机推荐
- AndroidStudio使用properties资源文件
			
在Android项目开发中,为了一些公用资源使用方便,可以在assets资源文件夹中将需要用到的资源写成.properties或者.json的文件形式,并进行读取使用.在做html5+javascri ...
 - WPF 使用 Edge 浏览器
			
原文:WPF 使用 Edge 浏览器 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.io 访 ...
 - android游戏开发系列(1)——迅雷不及掩耳的声音
			
这种声音是短而快的声音,应该采用android.media.SoundPool实现. SoundPool的特点: 1. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作.但是这 ...
 - DragControl
			
原文:DragControl 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/article/details/837911 ...
 - C#更改控制台文本的前景色和背景色
			
关键字:C# NET 控制台 前景色 背景色地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/csharp-console-color.html ...
 - 测试了下boost的序列化反序列化功能
			
// testSerialization.cpp : Defines the entry point for the console application. // #include "st ...
 - IIS Express 启用目录浏览
			
IIS Express 启用目录浏览,有需要的朋友可以参考下. 今天刚刚使用visual studio 2013创建第一个hello world,结果就发现提示错误. HTTP 错误 403.14 - ...
 - SICP 1.17-1.19
			
1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...
 - wpf 绑定表达式和手动更新源
			
<Window x:Class="BindingExpressionExam.MainWindow" xmlns="http://schemas.mi ...
 - c# 自定义公共类CallFunction-调用函数信息帮助类
			
/// <summary> /// 调用函数信息 /// </summary> public class CallFunction { /// <summary> ...