gpt4 book ai didi

c++ - Win32 : Bring a window to top

转载 作者:IT老高 更新时间:2023-10-28 12:41:17 25 4
gpt4 key购买 nike

我有一个 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)来解决。

最佳答案

试试这个,据说来自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_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
::SetForegroundWindow(m_hWnd);
::SetFocus(m_hWnd);
::SetActiveWindow(m_hWnd);
::AttachThreadInput(dwCurID, dwMyID, FALSE);

为了让一个窗口置顶,你应该得到你的窗口句柄,线程句柄,在前台的窗口线程句柄

然后我们将我们的线程附加到前台窗口线程并通过 AttachThreadInput 获取输入,然后我们设置我们的窗口 z 顺序 到最顶层,然后将其 z 顺序恢复正常,调用 SetForegroundWindow,SetFocus,SetActiveWindow 以确保我们的窗口被带到顶部并且处于事件状态并具有焦点

然后从旧的前台窗口线程中分离输入队列,使我们的线程成为唯一捕获输入事件的线程

那么我们为什么要调用AttachThreadInput,因为

SetFocus sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue.

AttachThreadInput 有什么作用?

The AttachThreadInput function can be used to allow a set of threads to share the same input state. By sharing input state, the threads share their concept of the active window. By doing this, one thread can always activate another thread's window. This function is also useful for sharing focus state, mouse capture state, keyboard state, and window Z-order state among windows created by different threads whose input state is shared.

我们使用 SetWindowPos 将窗口带到最顶层,如果窗口被隐藏,我们使用 SWP_HIDEWINDOW 显示窗口

SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order

如果你的问题是你的窗口也被最小化了,你应该在最后添加一行代码

ShowWindow(m_hWnd, SW_RESTORE);

关于c++ - Win32 : Bring a window to top,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com