我正在和一个软件开发人员一起开发一个C程序,它有一个浮动的首选项窗口。如果在运行时使用Windows任务栏切换到另一个程序,则浮动窗口仍位于切换到的程序上。我不是一个程序员,我的程序员告诉我没有办法阻止这一切。有人告诉我,他正在使用SetWindowPosition和一种叫做TOPMOST的东西,让这个窗口有权保持在最上面。我喜欢在我的程序中工作时它在上面,但当我切换到另一个程序时它不在上面。
有什么我可以告诉他,这样当我切换到另一个程序时,这个窗口不会保持在最上面,但当我返回到我的程序时,它会保持在最上面吗?
最佳答案
您可以使用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
消息,则不会删除最上面的标志。关于c - SetWindowPostion TOPMOST,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27137276/