我有一系列相当复杂的应用程序,它们依赖于在前台切换应用程序的能力。
我的问题是,每5到6次切换前台的应用程序,它就不能将应用程序前移。GetLastError不报告任何问题。我经常看到正确的应用程序在前台闪现片刻,然后前一个应用程序就可见了。
我有一个管理器应用程序,我有源代码,它产生和控制大约4个应用程序,我没有源代码。它产生/控制的应用程序之一也是一个管理器,它产生/控制大约5个应用程序。
这是一种kiosk设计,因此用户甚至不会有键盘或鼠标,只有一个触摸屏。
我已经尝试了Win32调用的每种组合来控制它们,我只是没有想法。
我的第一次尝试是:
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);我的第三次尝试: DWORD dwThreadID = GetWindowThreadProcessId(hApp,NULL);AttachThreadInput( dwThreadID,GetCurrentThreadId(),true);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);我的第四个尝试:
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);当涉及到窗口切换时,我觉得我错过了一个重要的问题。我知道只有前台进程可以切换窗口,但是当我的主管理器程序产生并启动我需要控制的所有其他进程时,我觉得它应该能够移动这些窗口。任何建议或建议,我们将不胜感激。
发布于 2010-09-23 02:19:42
你的AttachThreadInput()攻击(我认为)是一种众所周知的方法,可以用来破坏Windows中的焦点窃取反措施。但是,您使用了错误的句柄,您希望附加到当前具有焦点的线程。它不是hApp,否则你就不需要这个代码了。
使用GetForegroundWindow()获取带有焦点的窗口的句柄。
AttachThreadInput(
GetWindowThreadProcessId(GetForegroundWindow(), NULL),
GetCurrentThreadId(), TRUE
);虽然我认为第二个参数需要是hApp的线程ID。因为如果我没理解错的话你不想推开自己的窗户。我不确定这是否可行。
发布于 2012-08-24 13:42:18
我也有同样的问题,我不想搞乱线程。在实验中,我观察到了一个简单的技巧,可以使SetForegroundWindow()以预期的方式工作。下面是我所做的:
如果尚未调用最小化的窗口
的顶部
发布于 2015-10-06 19:36:52
在C#中最简单的解决方案是在前台显示一个窗口:
一旦你有了这个窗口的句柄,你就可以简单地调用:
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);
}哪里
const int SWP_NOMOVE = 0x0002;
const int SWP_NOSIZE = 0x0001;
const int SWP_SHOWWINDOW = 0x0040;https://stackoverflow.com/questions/3772233
复制相似问题