cyberpunker |
2017-08-04 08:57 |
Windows下 , 自己把自己 激活窗口
Windows下,Qt激活指定句柄的窗口 http://blog.csdn.net/aid414944/article/details/18993559 亲测可用:
#ifdef Q_OS_WIN
void activateMsWindow(WId id) {
//声明需要使用的函数指针变量 /*user32.dll*/ typedef unsigned int(_stdcall*GetWindowThreadProcessId)(WId id, unsigned int *lpdwProcessId); GetWindowThreadProcessId getWindowThreadProcessId;
typedef WId(_stdcall*GetForegroundWindow)(); GetForegroundWindow getForegroundWindow;
typedef bool(_stdcall*SetForegroundWindow)(WId id); SetForegroundWindow setForegroundWindow;
typedef WId(_stdcall*SetFocus)(WId id); SetFocus setFocus;
typedef bool(_stdcall*AttachThreadInput)(unsigned int idAttach, unsigned int idAttachTo, bool fAttach); AttachThreadInput attachThreadInput;
/*kernel32.dll*/ typedef unsigned int(_stdcall*GetCurrentThreadId)(); GetCurrentThreadId getCurrentThreadId;
//获取函数地址 QLibrary user32("user32"); user32.load(); getWindowThreadProcessId = (GetWindowThreadProcessId)user32.resolve("GetWindowThreadProcessId"); getForegroundWindow = (GetForegroundWindow)user32.resolve("GetForegroundWindow"); setForegroundWindow = (SetForegroundWindow)user32.resolve("SetForegroundWindow"); setFocus = (SetFocus)user32.resolve("SetFocus"); attachThreadInput = (AttachThreadInput)user32.resolve("AttachThreadInput");
QLibrary kernel32("kernel32"); kernel32.load(); getCurrentThreadId = (GetCurrentThreadId)kernel32.resolve("GetCurrentThreadId");
//调用函数激活指定句柄的窗口 //这种方法核心是使用AttachThreadInput函数,它可以连接当前激活窗口的输入队列,并使其共享,如此一来才能调用SetForegroundWindow()函数激活指定窗口到前台,否则会无效。 attachThreadInput(getWindowThreadProcessId(getForegroundWindow(), NULL), getCurrentThreadId(), true); setForegroundWindow(id); setFocus(id); attachThreadInput(getWindowThreadProcessId(getForegroundWindow(), NULL), getCurrentThreadId(), false);
}
能把这个函数拆成两个吧?把那一堆函数指针不弄成函数的局部变量? 试了下,编译各种问题。
|
|