我正在与C程序上的软件开发人员合作,该程序具有浮动首选项窗口。如果我在运行时使用Windows任务栏切换到另一个程序,我的浮动窗口仍然驻留在我切换到的程序上。我不是程序员,我的程序员告诉我,没有办法阻止这一点。我被告知他正在使用SetWindowPosition和一个名为TOPMOST的东西来给这个窗口保留最高权利。我喜欢在我的程序中工作时,但是当我切换到另一个程序时却不是。
有什么我可以告诉他这样做,当我切换到另一个程序但当我返回我的程序时,这个窗口不会保持最顶层吗?
答案 0 :(得分:3)
一种方法是不要使窗口最顶端(即不用SetWindowPos
标志调用HWND_TOPMOST
,而根本不设置WS_EX_TOPMOST
窗口样式),而是制作主窗口拥有的窗口。
为此,在创建浮动窗口时(使用CreateWindowEx
),您可以将主窗口的句柄指定为其父窗口。
拥有的窗口总是出现在它们的所有者之上,但它仍然是浮动的,并且会在其他应用程序的窗口后面。
答案 1 :(得分:0)
您可以使用WM_ACTIVATE
消息。 Windows激活或停用窗口时会发送此消息。如果用户切换到另一个应用程序,则应用程序的当前窗口会收到WM_ACTIVATE
消息,告知其正在停用。
这是一个在用户切换到另一个应用程序时设置/删除最顶层标志的示例(考虑到hFloatingWindow
是浮动窗口的窗口句柄):
LRESULT __stdcall YourWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
/* ... */
case WM_ACTIVATE:
DWORD pid = 0;
GetWindowThreadProcessId((HWND)lParam, &pid);
if (pid != GetCurrentProcessId()) /* switch to another task? */
{
if ((wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE))
{
if (SetWindowPos(hFloatingWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
{
/* handle error */
}
}
else
{
if (SetWindowPos(hFloatingWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
{
/* handle error */
}
}
}
return (0); /* message processed */
/* ... */
}
请注意,您必须将WM_ACTIVATE
的代码添加到应用程序的所有窗口过程中。这是必要的,因为用户可以从任何处于活动状态的窗口切换到另一个任务。如果当前活动窗口没有处理如上所示的WM_ACTIVATE
消息,则不会删除最顶部的标记。