Win32,C ++:创建弹出窗口而不会窃取焦点

时间:2009-05-12 13:39:38

标签: c++ windows winapi

我正在创建一个程序,在某些时候显示一个弹出窗口(就像一些聊天客户端一样),用户可以点击该窗口。但是,我不想从当前的应用程序中删除焦点。

我现在的方法是使用带有WS_POPUPWINDOW的HWND并最小化然后恢复窗口。然而,这从当前的应用程序中窃取了焦点。设置前景或隐藏并显示窗口并未使其显示在前景中。我希望能够继续使用HWND,这样我就可以在这个窗口中使用其他元素,但我不知道如何在没有偷走焦点的情况下给它前景。

我使用win32和c ++。

2 个答案:

答案 0 :(得分:22)

要显示而不激活:

ShowWindow(hwnd, SW_SHOWNOACTIVATE);

在不激活的情况下加注:

SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

答案 1 :(得分:0)

不幸的是,这不适用于我。该窗口是使用 CreateWindowExA 创建的,并使用 ShowWindow(hwnd,SW_SHOWNOACTIVATE)显示,但是键盘焦点仍然从具有焦点的窗口中被窃取。 (通过使用 SetWindowLong() SetLayeredWindowAttributes()来创建具有分层和透明属性的窗口)。

PS:具有焦点的窗口不是新创建的窗口的父窗口。

已解决:当我删除 SetForegroundWindow 调用时,此方法有效。此功能将激活作为参数传递的窗口。