奇怪的消息循环

pjl110 2011-03-24 04:31:53
我做了一个全局钩子的dll,用来向主窗体传递鼠标左键按下消息HM_MOUSE。然后在一个标准和win32程序的
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
函数中使用:
switch (message)
{
case HM_MOUSE:
count++;
wchar_t str[128];
wsprintf(str,L"第%d次收到鼠标左键点击消息!",count);
::SetWindowText(hWnd,str);
break;

成功地获得了来自任何窗口的鼠标点击消息!

好了!我的问题是:现在我认为一个win32程序内容太多,我把它精简成一个按钮!代码如下:
int WINAPI wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HWND hwnd = CreateWindowW(L"BUTTON",L" ",WS_OVERLAPPED,200,200,300,50,NULL,NULL,hInstance,NULL);

::ShowWindow(hwnd,true);
::UpdateWindow(hwnd);
SetupHook(hwnd,true);
MSG msg;

while (GetMessageW(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

}
return (int) msg.wParam;
}


可是这样一改,我发现一个问题,WinProc函数没了!
于是我就想在GetMessageW处应该能获得这个消息吧!
于是我把获得HM_MOUSE消息的代码加在了这:
while (GetMessageW(&msg, NULL, 0, 0))
{
if(msg.message == HM_MOUSE)
{
count++;
wchar_t str[128];
wsprintf(str,L"第%d次收到鼠标左键点击消息!",count);
::SetWindowText(hwnd,str);
::UpdateWindow(hwnd);
}
TranslateMessage(&msg);
DispatchMessage(&msg);

}


结果,我还是无论如何也获得不了HM_MOUSE消息!

我想问:
1、为什么获得不了?
2、如果我想为这个BUTTON按钮增加一个像窗口那样的WinProc,我应该怎么做?
...全文
121 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiwnx 2011-03-24
  • 打赏
  • 举报
回复
用SetClassLong()试试看
Lactoferrin 2011-03-24
  • 打赏
  • 举报
回复
或者使用SetWindowsHookExW(WH_CALLWNDPROC来截获你的消息
Lactoferrin 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pjl110 的回复:]

引用 2 楼 lactoferrin 的回复:
你的dll是如何向窗口丢消息的?如果用SendMessage之类的是不能由GetMessage返回得到,用PostMessage的可以

如果我想为这个BUTTON按钮增加一个像窗口那样的WinProc,可以使用GetWindowLongW先得到原来的窗口过程地址,然后用SetWindowLongW设置一个新的窗口过程。

Dispatc……
[/Quote]
在你提供的wndproc最后return CallWindowProcW(原来的地址,hWnd,Msg,wParam,lParam);
pjl110 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lactoferrin 的回复:]
你的dll是如何向窗口丢消息的?如果用SendMessage之类的是不能由GetMessage返回得到,用PostMessage的可以

如果我想为这个BUTTON按钮增加一个像窗口那样的WinProc,可以使用GetWindowLongW先得到原来的窗口过程地址,然后用SetWindowLongW设置一个新的窗口过程。

DispatchMessage也是分AW的。
[/Quote]
SetWindowLongW设置了新的窗口过程的地址,窗口自绘制没了怎么办?谢谢。
Simao 2011-03-24
  • 打赏
  • 举报
回复
用超类化来完成你的需求!
Lactoferrin 2011-03-24
  • 打赏
  • 举报
回复
你的dll是如何向窗口丢消息的?如果用SendMessage之类的是不能由GetMessage返回得到,用PostMessage的可以

如果我想为这个BUTTON按钮增加一个像窗口那样的WinProc,可以使用GetWindowLongW先得到原来的窗口过程地址,然后用SetWindowLongW设置一个新的窗口过程。

DispatchMessage也是分AW的。
xiaoguailong3 2011-03-24
  • 打赏
  • 举报
回复
按钮不是这个消息吧,你建个MFC对话框程序,跟踪下看按钮的消息是什么

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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