【发布时间】:2010-10-29 07:28:49
【问题描述】:
我有一个 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);
我该如何解决这个问题? 提前致谢。
(回复aJ,hwnd2没有父窗口,因为它需要是顶层窗口,所以它可以在其他窗口的前面/后面)
(hwnd2是一个媒体播放器,由几个窗口组成,其中一个窗口用于视频显示,另外两个用于进度条和音量条的轨迹栏控件,一个用于控制面板的工具栏控件。)
(有一个可能有帮助,无论我点击哪个窗口hwnd2,hwnd都会自动弹出,就像“鼠标在z-order在hwnd的顶部”一样,包括菜单栏和非客户区,等等)
(这个媒体播放器是用Direct Show写的。我用IVideoWindow::put_Owner把video window作为video owner,Direct Show内部创建一个sub-video window作为video window的child。除了这个sub-我看不到源代码的视频窗口,我在 hwnd2 中没有看到任何可疑的东西。)
我找到了原因,这是因为 Direct Show。我使用多线程执行它,然后问题就解决了。但是……为什么??
这个问题可以通过使用 PostMessage(而不是 SendMessage)来解决。
【问题讨论】:
-
hwnd2 没有父母的任何具体原因? hwnd 可以在创建时设置为父级。
-
你在hwnd2的鼠标按键处理代码中做了什么?有什么可疑的地方吗?
-
那么你是如何使用 PostMessage 解决的?
标签: c++ winapi visual-c++