已经设置了全局Hook,为什么还是只能在主程序中响应消息

cyh706510441 2015-08-09 06:41:03
写了一个程序,功能为:在桌面双击鼠标左键,显示/隐藏桌面图标。
做法:设置了全局的Hook,判断WM_LBUTTONDBLCLK消息,显示/隐藏图标。在测试程序(mfc,dlg)中加载了这个dll,但只能在对话框中双击能实现功能,在桌面双击,不响应。不知道错误在哪里。。下面是dll中的代码:
#include "stdafx.h"
#include "DesktopHook.h"

#pragma data_seg("MySection")
HHOOK g_hMsgHook = NULL;
HWND g_hDesktopWnd = NULL;
BOOL g_bShow = TRUE;
#pragma data_seg()
#pragma comment(linker, "/section:MySection,RWS")

HWND FindDesktopWindow()
{
HWND ParentWnd;
HWND ViewWnd = NULL;
HWND DesktopWnd;
ParentWnd = ::FindWindowEx(0, 0, L"WorkerW", L""); // 获得第一个WorkerW类的窗口
while ((!ViewWnd) && ParentWnd)
{
ViewWnd = ::FindWindowEx(ParentWnd, 0, L"SHELLDLL_DefView", 0);
ParentWnd = ::FindWindowEx(0, ParentWnd, L"WorkerW", L""); // until找到正确的WorderW类
}

// 如果失败,尝试在Program Manager下搜索
if (ViewWnd == NULL)
{
ParentWnd = ::FindWindow(L"Progman", L"Program Manager");
ViewWnd = ::FindWindowEx(ParentWnd, 0, L"SHELLDLL_DefView", 0);
}
DesktopWnd = ::FindWindowEx(ViewWnd, 0, L"SysListView32", L"FolderView");

return DesktopWnd;
}

LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
MSG* pMsg = (MSG*)lParam;
switch (pMsg->message)
{
case WM_LBUTTONDBLCLK:
g_bShow = !g_bShow;
::ShowWindow(g_hDesktopWnd, g_bShow ? SW_SHOW : SW_HIDE);
break;
default:
break;
}
return ::CallNextHookEx(g_hMsgHook, code, wParam, lParam);
}


void SetDesktopHook()
{
// Get desktop hwnd
g_hDesktopWnd = FindDesktopWindow();

// Hook post message
g_hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, GetModuleHandle(L"DesktopHook"), 0);
}

void FreeDesktopHook()
{
::UnhookWindowsHookEx(g_hMsgHook);
}


...全文
89 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,471

社区成员

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

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