判断窗口是否挂起

// ishung.cpp (Windows 95/98/NT/2000)
//
// This example will show you how you can obtain the current status
// of the application.
//
//
// (c)1999 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com

#include <windows.h>
#include <stdio.h>


// User32!IsHungAppWindow (NT specific!)
//
// The function retrieves the status (running or not responding) of the
// specified application
//
// BOOL IsHungAppWindow(
//   HWND hWnd,        // handle to main app's window
// );
typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW)(HWND);


// User32!IsHungThread (95/98 specific!)
//
// The function retrieves the status (running or not responding) of the
// specified thread
//
// BOOL IsHungThread(
//   DWORD dwThreadId, // The identifier of the main app's window thread
// );
typedef BOOL (WINAPI *PROCISHUNGTHREAD)(DWORD);


PROCISHUNGAPPWINDOW   IsHungAppWindow;
PROCISHUNGTHREAD   IsHungThread;


void main(int argc, char* argv[])
{
 if (argc<2)
 {
  printf("Usage:\n\nishung.exe hWnd\n");
  return;
 }

 HWND hWnd;
 sscanf(argv[1],"%lx",&hWnd);

 if (!IsWindow(hWnd))
 {
  printf("Incorrect window handle\n");
  return;
 }

 HMODULE hUser32 = GetModuleHandle("user32");
 if (!hUser32)
  return;

 IsHungAppWindow = (PROCISHUNGAPPWINDOW)
                                         GetProcAddress( hUser32,
                                                         "IsHungAppWindow" );

 IsHungThread = (PROCISHUNGTHREAD) GetProcAddress( hUser32,
                                                          "IsHungThread" );

 if (!IsHungAppWindow && !IsHungThread)
  return;

 OSVERSIONINFO osver;
 osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 if (!GetVersionEx(&osver))
  return;

 BOOL IsHung;

 if (osver.dwPlatformId&VER_PLATFORM_WIN32_NT)
  IsHung = IsHungAppWindow(hWnd);
 else
  IsHung = IsHungThread(GetWindowThreadProcessId(hWnd,NULL));

 if (IsHung)
  printf("Not Responding\n");
 else
  printf("Running\n");
}

posted @ 2006-02-16 22:55  Max Woods  阅读(791)  评论(0编辑  收藏  举报