gpt4 book ai didi

winapi - 在 Hook 内从 HWND 获取 HMENU

转载 作者:行者123 更新时间:2023-12-02 14:25:34 25 4
gpt4 key购买 nike

我正在我的应用程序中安装一个 Hook 来获取标准的编辑上下文菜单(带有撤消/复制/编辑/粘贴/等)。我需要为我的应用程序插入一个新的菜单项。

我已经设置了一个 Windows Hook ,但我似乎无法获取上下文菜单的 HMENU。这是我设置钩子(Hook)的地方:

g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, NULL, GetCurrentThreadId());

这是我的回调函数:

LRESULT CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
LPCWPSTRUCT cwps = (LPCWPSTRUCT)lParam;
switch(cwps->message)
{
case WM_CREATE:
{
WCHAR szClass[128];
GetClassName(cwps->hwnd, szClass, 127);

if (wcscmp(szClass, L"#32768") == 0)
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)cwps->lParam;
HMENU hMenu = GetMenu(cwps->hwnd);
// hMenu is 0x0

//MENUINFO info;

//ZeroMemory(&info, sizeof(MENUINFO));
//info.cbSize = sizeof(info);
//GetMenuInfo(hMenu, &info);

MessageBox(NULL, L"Test", L"Test", NULL);
}
break;
}
}
}

return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

我还尝试使用 WH_CALLWNDPROCRET 设置 Hook ,但是这个甚至没有捕获菜单的 WM_CREATE 消息。

有人知道如何获取这种特殊情况的 HMENU 吗?

谢谢,凯文

最佳答案

您可以发送MN_GETHMENU获取 HMENU 的消息:

case WM_CREATE:
{
WCHAR szClass[128];
GetClassName(cwps->hwnd, szClass, 127);
if (wcscmp(szClass, L"#32768") == 0)
{
// Must delay MN_GETHMENU...
PostMessage(g_hDlg,WM_APP,(WPARAM)cwps->hwnd,(LPARAM)HookCallWndProc);
}
break;
}

...

LRESULT CALLBACK MyWindow(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg)
{
case WM_APP:
if (lp == (LPARAM)HookCallWndProc) // Just making sure it is our special message
{
HMENU hMenu = (HMENU) SendMessage((HWND)wp,MN_GETHMENU,0,0);
if (hMenu)
{
AppendMenu(hMenu,MF_STRING,666,L"Hello SO");
}
}
break;

这有点 hacky,但在自定义这样的控件时,hacks 几乎是不可避免的......

关于winapi - 在 Hook 内从 HWND 获取 HMENU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8781283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com