我通过MFC程序可以捕获到,但用控制台程序却没反应,消息循环貌似没起作用,代码如下:
#include "stdafx.h"
#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd,      // handle to window
UINT msg,      // WM_POWERBROADCAST
                            WPARAM wParam,  // PBT_APMRESUMEAUTOMATIC
                            LPARAM lParam) // zero{
    if ((msg == WM_POWERBROADCAST) && (wParam == PBT_APMRESUMEAUTOMATIC))
{
MessageBox(NULL, _T("System resumed automatically."), _T("Alert!"), MB_OK);
} return DefWindowProc(NULL, msg, wParam, lParam);
}int _tmain(int argc, _TCHAR* argv[])
{
//catch system wakeup message
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0))
{
if(msg.message == WM_POWERBROADCAST)
printf(_T("WM_POWERBROADCAST"));
if (msg.wParam == PBT_APMRESUMEAUTOMATIC)
printf(_T("PBT_APMRESUMEAUTOMATIC")); TranslateMessage(&msg); 
                  DispatchMessage(&msg); 
} return 0;
}
连printf()函数都没执行,哪位能解释下?
谢谢!

解决方案 »

  1.   

    你得创建一个窗口,才能进消息循环呢。你创建了窗口,然后ShowWindow(hWnd, SW_HIDE);这样窗口不显示。
      

  2.   

    #include "stdafx.h"
    #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = NULL;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = _T("Test");
    wcex.hIconSm = NULL; RegisterClassEx(&wcex); HWND hWnd;
    hWnd = CreateWindow(_T("Test"), _T(""), WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL); if (!hWnd)
    {
    return FALSE;
    } ShowWindow(hWnd, SW_HIDE);
    UpdateWindow(hWnd); //catch system wakeup message
    MSG msg;
    while(::GetMessage(&msg, NULL, 0, 0))
    {
    if(msg.message == WM_POWERBROADCAST)
    printf(_T("WM_POWERBROADCAST"));
    if (msg.wParam == PBT_APMRESUMEAUTOMATIC)
    printf(_T("PBT_APMRESUMEAUTOMATIC")); TranslateMessage(&msg);
    DispatchMessage(&msg);
    } return 0;
    }
      

  3.   

    谢谢楼上的回复,按照你的方法现在问题已经解决。
    不过在while循环里判断消息没有起作用,如下:
    while(::GetMessage(&msg, NULL, 0, 0)) 

    if(msg.message == WM_POWERBROADCAST) 
    printf(_T("WM_POWERBROADCAST")); 
    if (msg.wParam == PBT_APMRESUMEAUTOMATIC) 
    printf(_T("PBT_APMRESUMEAUTOMATIC")); TranslateMessage(&msg); 
    DispatchMessage(&msg); 

    当我从睡眠/休眠唤醒时,WndProc函数可以抓到消息,但while循环中的printf无输出,是不是不能这样判断?
      

  4.   

    在while内设定一个断点看看能否进入?
    如果不能,那就用
    if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) 
    取代试试看
      

  5.   

    while循环是进去了,但if(msg.message == WM_POWERBROADCAST)的条件一直不成立,不知道为什么?
      

  6.   

    不至于吧,窗口过程能收到,while循环肯定能收到啊。你把printf换成MessageBox试试。
      

  7.   

    很郁闷,不知道为什么while循环里判断不行,源代码如下:
    #include "stdafx.h" 
    #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

    if ((message == WM_POWERBROADCAST) && (wParam == PBT_APMRESUMEAUTOMATIC))
    printf(_T("In WndProc: System Wake-up\n")); return DefWindowProc(hWnd, message, wParam, lParam); 

    int _tmain(int argc, _TCHAR* argv[]) 

    WNDCLASSEX wcex;  wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WndProc; 
    wcex.cbClsExtra = 0; 
    wcex.cbWndExtra = 0; 
    wcex.hInstance = NULL; 
    wcex.hIcon = NULL; 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = _T("Test"); 
    wcex.hIconSm = NULL;  RegisterClassEx(&wcex);  HWND hWnd; 
    hWnd = CreateWindow(_T("Test"), _T(""), WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);  if (!hWnd) 

    return FALSE; 
    }  ShowWindow(hWnd, SW_HIDE); 
    UpdateWindow(hWnd);  //catch system wakeup message 
    MSG msg; 
    while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) 

    if(msg.message == WM_POWERBROADCAST)
         ::MessageBox(NULL, _T("WM_POWERBROADCAST"), _T("OK"), MB_OK);
    if (msg.wParam == PBT_APMRESUMEAUTOMATIC)
    ::MessageBox(NULL, _T("PBT_APMRESUMEAUTOMATIC"), _T("OK"), MB_OK); TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }  return 0; 
    }请指教!
      

  8.   


    在里边 msg.message 捕获到的消息是什么?
    原来用MFC的时候真的可以完整捕获?
    试试看开启这个控制台,然后让计算机休眠,再唤醒的操作执行了吗?