首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win32 SetForegroundWindow不可靠

Win32 SetForegroundWindow不可靠
EN

Stack Overflow用户
提问于 2010-09-23 02:00:16
回答 7查看 18K关注 0票数 16

我有一系列相当复杂的应用程序,它们依赖于在前台切换应用程序的能力。

我的问题是,每5到6次切换前台的应用程序,它就不能将应用程序前移。GetLastError不报告任何问题。我经常看到正确的应用程序在前台闪现片刻,然后前一个应用程序就可见了。

我有一个管理器应用程序,我有源代码,它产生和控制大约4个应用程序,我没有源代码。它产生/控制的应用程序之一也是一个管理器,它产生/控制大约5个应用程序。

这是一种kiosk设计,因此用户甚至不会有键盘或鼠标,只有一个触摸屏。

我已经尝试了Win32调用的每种组合来控制它们,我只是没有想法。

我的第一次尝试是:

代码语言:javascript
复制
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);

我第二次尝试是:

代码语言:javascript
复制
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);

我的第三次尝试: DWORD dwThreadID = GetWindowThreadProcessId(hApp,NULL);AttachThreadInput( dwThreadID,GetCurrentThreadId(),true);

代码语言:javascript
复制
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);

AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);

我的第四个尝试:

代码语言:javascript
复制
DWORD dwThreadID = GetWindowThreadProcessId(hApp, NULL);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), true);

SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);

SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);

AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);

当涉及到窗口切换时,我觉得我错过了一个重要的问题。我知道只有前台进程可以切换窗口,但是当我的主管理器程序产生并启动我需要控制的所有其他进程时,我觉得它应该能够移动这些窗口。任何建议或建议,我们将不胜感激。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-23 02:19:42

你的AttachThreadInput()攻击(我认为)是一种众所周知的方法,可以用来破坏Windows中的焦点窃取反措施。但是,您使用了错误的句柄,您希望附加到当前具有焦点的线程。它不是hApp,否则你就不需要这个代码了。

使用GetForegroundWindow()获取带有焦点的窗口的句柄。

代码语言:javascript
复制
AttachThreadInput(
    GetWindowThreadProcessId(GetForegroundWindow(), NULL),
    GetCurrentThreadId(), TRUE
);

虽然我认为第二个参数需要是hApp的线程ID。因为如果我没理解错的话你不想推开自己的窗户。我不确定这是否可行。

票数 7
EN

Stack Overflow用户

发布于 2012-08-24 13:42:18

我也有同样的问题,我不想搞乱线程。在实验中,我观察到了一个简单的技巧,可以使SetForegroundWindow()以预期的方式工作。下面是我所做的:

如果尚未调用最小化的窗口

  • 调用SetForegroundWindow(),则窗口将最小化,并且您的窗口将位于

的顶部

票数 10
EN

Stack Overflow用户

发布于 2015-10-06 19:36:52

在C#中最简单的解决方案是在前台显示一个窗口:

一旦你有了这个窗口的句柄,你就可以简单地调用:

代码语言:javascript
复制
    SetWindowPos(handle, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    ShowWindow(handle, 5);
    SetForegroundWindow(handle);

    // If it is minimized, show the window
    if (IsIconic(handle))
    {
      ShowWindow(handle, 3);
    }

哪里

代码语言:javascript
复制
const int SWP_NOMOVE = 0x0002;
const int SWP_NOSIZE = 0x0001;
const int SWP_SHOWWINDOW = 0x0040;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3772233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档