如何判断WINDOWS程序窗口是否无响应


SendMessageTimeout()

将指定的消息发送到一个或多个窗口。

此函数的原理是向一个待测试窗口发送消息,并期待返回值,如果没有返回值则说明窗口无响应。

函数原型:

LRESULT SendMessageTimeoutA(
  HWND       hWnd,
  UINT       Msg,
  WPARAM     wParam,
  LPARAM     lParam,
  UINT       fuFlags,
  UINT       uTimeout,
  PDWORD_PTR lpdwResult
);


参数1:要测试窗口的窗口句柄。

参数2:要发送的消息。

参数3:任何其他特定于消息的信息。

参数4:任何其他特定于消息的信息。

参数5:这个函数的行为。此参数可以是以下一个或多个值。


值:SMTO_ABORTIFHUNG   含义:如果接收线程似乎没有响应或“挂起”,则函数返回而不等待超时时间过去。

值:SMTO_BLOCK   含义:阻止调用线程处理任何其他请求,直到函数返回。

值:SMTO_NORMAL   含义:在等待函数返回时,不会阻止调用线程处理其他请求。

值:SMTO_NOTIMEOUTIFNOTHUNG   含义:只要接收线程正在处理消息,该功能就不会强制执行超时期限。

值:SMTO_ERRORONEXIT   含义:如果接收窗口被销毁或其拥有的线程在处理消息时死亡,则该函数应返回0。

参数6:超时时间的持续时间,以毫秒为单位。如果消息是广播消息,则每个窗口可以使用完整的超时时段。例如,如果指定五秒超时时间并且有三个顶级窗口无法处理该消息,则最多可能有15秒的延迟。

参数7:消息处理的结果。此参数的值取决于指定的消息。 一个DWORD型数据,用于接收返回值。


例:

DWORD vers;

LRESULT millio=SendMessageTimeout(peop,WM_NULL,0,0,SMTO_ABORTIFHUNG,3000,&vers);


经过几次测试只有参数5填"SMTO_ERRORONEXIT"时测试窗口是否响应时结果正确,其他选项以及选项的组合测试结果与实际不符,有待于进一步使用。参数5是可以使用"SMTO_ABORTIFHUNG|SMTO_BLOCK"的形式来选择多个值。

猜你喜欢

转载自blog.csdn.net/l198738655/article/details/83501356