31 c++ winapi visual-c++
我有一个Windows程序,里面有两个2个窗口:
hwnd (main interface)
hwnd2 (toplevel window, no parent, created by hwnd)
Run Code Online (Sandbox Code Playgroud)
当我双击hwnd时,我需要hwnd2弹出并显示一些数据,所以我使用这个函数将hwnd2带到顶部:
BringWindowToTop(hwnd2);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个问题?提前致谢.
(对于回复aJ,hwnd2没有父级,因为它需要是一个顶层窗口,因此它可以位于其他窗口的前面/后面)
(hwnd2是一个由多个窗口组成的媒体播放器,其中一个窗口用于显示视频,另外两个用于进度条和音量条的轨道栏控件,一个用于控制面板的工具栏控件.)
(有一个这可能有帮助,无论我点击hwnd2的哪个窗口,hwnd自动弹出如"鼠标在Z顺序的hwnd顶部",包括菜单栏和非客户区等)
(此媒体播放器在Direct Show中写入.我使用IVideoWindow :: put_Owner将视频窗口作为视频所有者,Direct Show在内部创建一个子视频窗口作为视频窗口的子窗口.除了这个子视频窗口,我看不到源代码,我在hwnd2中看不到任何可疑的东西.)
我找到了原因,这是因为Direct Show.我使用多线程执行它,然后问题解决了.但为什么??
使用PostMessage(而不是SendMessage)可以解决此问题.
bow*_*han 20
试试这个,据说来自M $
HWND hCurWnd = ::GetForegroundWindow();
DWORD dwMyID = ::GetCurrentThreadId();
DWORD dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
::AttachThreadInput(dwCurID, dwMyID, TRUE);
::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
::SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
::SetForegroundWindow(m_hWnd);
::AttachThreadInput(dwCurID, dwMyID, FALSE);
::SetFocus(m_hWnd);
::SetActiveWindow(m_hWnd);
Run Code Online (Sandbox Code Playgroud)
Nun*_*uno 13
两者都很棒:
::SetForegroundWindow(wnd)
Run Code Online (Sandbox Code Playgroud)
要么
::SetWindowPos(m_hWnd, // handle to window
HWND_TOPMOST, // placement-order handle
0, // horizontal position
0, // vertical position
0, // width
0, // height
SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE// window-positioning options
);
Run Code Online (Sandbox Code Playgroud)
但请记住,最后一个窗口始终位于顶部.
经过多次尝试和错误,我找到了以下解决此问题的方法:
SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); // restore the minimize window
SetForegroundWindow(hwnd);
SetActiveWindow(hwnd);
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
//redraw to prevent the window blank.
RedrawWindow(hwnd, NULL, 0, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN );
Run Code Online (Sandbox Code Playgroud)
hwnd 是您的 windows HWND 。请不要只是复制和粘贴。您还需要GetLastError在每次 api 调用后使用来检查 api 错误。
我在我的 win7 上确认了以下结果: