我有一个 Windows 程序,其中有两个 2 窗口:
hwnd (main interface)
hwnd2 (toplevel window, no parent, created by hwnd)
当我双击 hwnd 时,我需要弹出 hwnd2 并显示一些数据,因此我使用此函数将 hwnd2 置于顶部:
BringWindowToTop(hwnd2);
hwnd2 被带到顶部,但有一点奇怪。当我再次点击hwnd2时,hwnd(主界面)又自动弹出。
我尝试使用以下函数来解决这个问题,但它们都不起作用。
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
BringWindowToTop(hwnd2); //This is the function brings hwnd2 to top
SetForegroundWindow(hwnd2); //doesn't work
SetWindowPos(hwnd2, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
SetWindowPos(hwnd2, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
// hwnd2 "always" on top, not what I want
SetActiveWindow(hwnd2); // doesn't work too (for replying to Magnus Skog, thanks)
SwitchToThisWindow(hwnd2, TRUE);// got the same problem with BringWindowToTop function
SwitchToThisWindow(hwnd2, FALSE);
我该如何解决这个问题?
提前致谢。
(为了回复 aN,hwnd 2 没有父窗口,因为它需要是顶级窗口,因此它可以位于其他窗口的前面/后面)
(hwnd2是一个媒体播放器,由多个窗口组成,其中一个窗口用于视频显示,另外两个用于进度条和音量条的轨迹栏控件,一个用于控制面板的工具栏控件。)
(有一个这个可能会有所帮助,无论我点击hwnd2的哪个窗口,只要“鼠标按Z顺序位于hwnd之上”,hwnd就会自动弹出,包括菜单栏和非客户区等)
(这个媒体播放器是用Direct Show编写的。我使用IVideoWindow::put_Owner将视频窗口作为视频所有者,Direct Show内部创建一个子视频窗口作为视频窗口的子窗口。除了这个子视频窗口我看不到源代码,我在 hwnd2 中没有看到任何可疑的东西。)
我找到了原因,就是因为Direct Show。我用多线程来执行,然后问题就解决了。但为什么??
这个问题可以通过使用PostMessage(而不是SendMessage)来解决。