winapi-FindWindow vs HCBT_CREATEWND

winapi-FindWindow vs HCBT_CREATEWND,winapi,Winapi,我需要找到上下文菜单的HWND。我在教程中创建了一个上下文菜单,但没有子菜单。 我可以这样使用FindWindow函数: HWND hWndMenu = FindWindow(TEXT("#32768"), NULL); 我也可以使用WH_CBT挂钩。以下是钩子程序: LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam) { if (code == HCBT_CREATEWND) {

我需要找到上下文菜单的HWND。我在教程中创建了一个上下文菜单,但没有子菜单。 我可以这样使用FindWindow函数:

HWND hWndMenu = FindWindow(TEXT("#32768"), NULL);
我也可以使用WH_CBT挂钩。以下是钩子程序:

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code == HCBT_CREATEWND)
    {
        HWND hwnd = (HWND)wParam;
        WCHAR name[1024] = { 0 };
        GetClassName(hwnd, name, sizeof(name));

        if (wcscmp(name, L"#32768"))
        {
            HWND hwndMenu = FindWindow(TEXT("#32768"), NULL);
            std::cout << "HCBT_CREATEWND hwnd: " << hwnd << std::endl;
            std::cout << "FindWindow hwnd: " << hwndMenu << std::endl;
        }
    }

    return code < 0 ? CallNextHookEx(myHook, code, wParam, lParam) : 0;
} 
LRESULT回调HookProc(int-code,WPARAM-WPARAM,LPARAM-LPARAM)
{
如果(代码==HCBT_CREATEWND)
{
HWND HWND=(HWND)wParam;
WCHAR名称[1024]={0};
GetClassName(hwnd,name,sizeof(name));
if(wcscmp(名称,L“#32768”))
{
HWND hwndMenu=FindWindow(文本(#32768)),NULL;

std::cout调用WH_CBT hook时,菜单窗口仍在创建过程中,但FindWindow()尚不可用。因此,您最终会找到其他地方存在的另一个不相关的菜单窗口。这就是为什么您会看到不同的HWND。

为什么您要从CBT过程调用
FindWindow
?您已经有了所需类类型的
HWND
,然后您会去找它(或另一个窗口)全部结束。为什么?这只是一个显示意外结果的简化示例。值不应该相同吗?您的理解是什么?我想使用WH_CBT而不是FindWindow,因为FindWindow不允许获取子菜单HWND。让我们假设我需要向子菜单发送消息MN_SELECITEM,所以我从最小值开始测试基于WH_CBT发送消息是否有效的示例。对于上面的示例,将消息发送到主菜单仅适用于FindWindow返回的HWND,但由于子菜单的原因,我想使用WH_CBT而不是FindWindow,它不起作用。如何为子菜单查找HWND?我找到了EnumDesktopWindows函数,但可能没有e是另一种方式?@Irbis好吧,首先,你必须等到菜单完全创建之后。我会让WH_CBT hook PostMessage()将自定义消息发送到一个私有窗口,然后在收到消息时搜索菜单。或者,至少,搜索响应HCBT_ACTIVATE。或者,查看SetWinEventHook(),它具有多个与菜单相关的事件