我有一个Windows程序,其中有两个窗口:
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);
我该怎么解决这个问题呢?谢谢提前回答。(针对aJ的回复,hwnd2没有父级窗口,因为它需要成为顶级窗口,以便在其他窗口前后显示。)(hwnd2是一个由几个窗口组成的媒体播放器,其中一个窗口用于视频显示,另外两个滑动条控件用于进度条和音量条,一个工具栏控件用于控制面板。)(有一种情况可能会有所帮助,只要在Z顺序中"鼠标位于hwnd上方",包括菜单栏和非客户区等,无论我点击hwnd2上的哪个窗口,hwnd都会自动弹出。)(这个媒体播放器是使用DirectShow编写的。我使用IVideoWindow :: put_Owner将视频窗口设置为视频所有者,Direct Show在内部创建子视频窗口作为视频窗口的子级。除了这个子视频窗口我看不到源代码之外,在hwnd2中我看不到任何可疑的东西。)(我找到了原因,是因为DirectShow。我使用多线程来执行它,然后问题得到了解决。但是...为什么?)(可以通过使用PostMessage(而不是SendMessage)来解决此问题。)