我通过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()函数都没执行,哪位能解释下?
谢谢!
#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()函数都没执行,哪位能解释下?
谢谢!
解决方案 »
- 窗体中间部份是透明的,可以看到下层窗体的视频,怎么样才能让鼠标不穿透中间的透明区域?
- 如何在程序最小化时,不间断检测鼠标的移动
- 从原理上说,为什么窗口的创建需要提供一个父窗口的句柄?要这个信息有什么用呀?不要行不
- COMBOBOX的基础问题
- 很菜的问题,散分!
- 请akiy(宏)接分:
- 超难:如何监控应用程序对某ActiveX控件的调用情况,比如使用那些接口,参数如何,返回什么值?谢谢!
- 请教高手一个关于图像显示的问题
- 如何做一个浮动窗口添加到VC开发环境中
- 如何在VC编程开头加入库文件
- IWebBrowser2::navigate 不成功,错误代码0x800700aa:请求资源在使用中
- CRichEditCtrl背景不能透明的问题。希望大大们都来看看
#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;
}
不过在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无输出,是不是不能这样判断?
如果不能,那就用
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
取代试试看。
#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;
}请指教!
在里边 msg.message 捕获到的消息是什么?
原来用MFC的时候真的可以完整捕获?
试试看开启这个控制台,然后让计算机休眠,再唤醒的操作执行了吗?