控制台程序如何捕获系统从睡眠/休眠唤醒消息?

nostopping 2009-12-19 10:43:14
我通过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()函数都没执行,哪位能解释下?
谢谢!
...全文
802 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fireway2008 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nostopping 的回复:]
while循环是进去了,但if(msg.message == WM_POWERBROADCAST)的条件一直不成立,不知道为什么?
[/Quote]

在里边 msg.message 捕获到的消息是什么?
原来用MFC的时候真的可以完整捕获?
试试看开启这个控制台,然后让计算机休眠,再唤醒的操作执行了吗?
nostopping 2009-12-21
  • 打赏
  • 举报
回复
很郁闷,不知道为什么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;
}

请指教!
WaistCoat12 2009-12-20
  • 打赏
  • 举报
回复
不至于吧,窗口过程能收到,while循环肯定能收到啊。

你把printf换成MessageBox试试。
nostopping 2009-12-20
  • 打赏
  • 举报
回复
while循环是进去了,但if(msg.message == WM_POWERBROADCAST)的条件一直不成立,不知道为什么?
Fireway2008 2009-12-20
  • 打赏
  • 举报
回复
在while内设定一个断点看看能否进入?
如果不能,那就用
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
取代试试看
nostopping 2009-12-20
  • 打赏
  • 举报
回复
谢谢楼上的回复,按照你的方法现在问题已经解决。
不过在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无输出,是不是不能这样判断?
WaistCoat12 2009-12-19
  • 打赏
  • 举报
回复
#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;
}
WaistCoat12 2009-12-19
  • 打赏
  • 举报
回复
你得创建一个窗口,才能进消息循环呢。

你创建了窗口,然后ShowWindow(hWnd, SW_HIDE);这样窗口不显示。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧