Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从另一个窗口显示系统菜单_C++_Winapi_Menu - Fatal编程技术网

C++ 从另一个窗口显示系统菜单

C++ 从另一个窗口显示系统菜单,c++,winapi,menu,C++,Winapi,Menu,我现在正在做的项目本质上是Ultramon(多任务栏程序)的开源版本。因此,将应用程序想象成与windows任务栏一样。每个窗口的按钮等。这是使用WinAPI在C/C++中编码的 我刚刚开始做这件事,并且已经完成了一些功能。然而,我在获取系统菜单(例如右键单击任务栏“按钮”时获得的菜单)时遇到了困难,显示了我希望它们显示的时间和位置 我正在尝试使用: HMENU menu = GetSystemMenu(item, false); SetForegroundWindow(hWnd); Trac

我现在正在做的项目本质上是Ultramon(多任务栏程序)的开源版本。因此,将应用程序想象成与windows任务栏一样。每个窗口的按钮等。这是使用WinAPI在C/C++中编码的

我刚刚开始做这件事,并且已经完成了一些功能。然而,我在获取系统菜单(例如右键单击任务栏“按钮”时获得的菜单)时遇到了困难,显示了我希望它们显示的时间和位置

我正在尝试使用:

HMENU menu = GetSystemMenu(item, false); 
SetForegroundWindow(hWnd);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, 0, 0, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);
item是我想要菜单的HWND,HWND是我想要菜单显示的按钮/项目的HWND。(现在显示在0,0,我主显示器的左上角)

对于自定义的系统菜单,此代码每次都非常有效。它不是“恢复”、“最大化”等的标准菜单,它还添加了一些菜单项。这些菜单将始终显示在我想要的位置

但是,默认的基本系统菜单(例如仅具有最大化、还原、关闭等功能的菜单)将仅在我第一次使用它们时显示。之后他们拒绝露面。除非我重新启动计算机,否则请再次运行,此时它们工作正常

注:
setforegroundindow(hWnd)
PostMessage(hWnd,WM_NULL,0,0)在那里,因为我在某个地方读到,系统菜单只有在第一次使用时才会起作用,除非我把它带到前台,但它仍然不能正常工作

那么,有没有人知道如何让它正常工作?或者为什么它只在我重新启动计算机后第一次工作



刚刚测试了一些东西,如果我关闭窗口(如退出程序)并重新打开它,它还会再次显示窗口的系统菜单。但再一次,它只会显示一次,然后停止工作

这可能有问题,但您是否尝试过设置窗口焦点,然后通过SendInput之类的方式发出Alt+空格?

这不会显示系统菜单[Paul]希望他们在何时何地显示。请链接到此项目:)您不应该检查用户在TrackPopupMenu中单击的项目,然后将其传递到WM_SYSCOMMAND中吗,没有自定义系统菜单的应用程序的问题在于,而且据我所知,将所有权分配给您的进程,而不是发送WM_NULL。当进程退出时,菜单将被销毁,但GetSystemMenu继续返回相同(现在无效)的菜单句柄。Alt+Space仍然可以工作,大概是因为窗口管理器返回到它自己的系统菜单的全局副本。