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);
}
能把这个函数拆成两个吧?把那一堆函数指针不弄成函数的局部变量? 试了下,
编译各种
问题。