• 3521阅读
  • 0回复

Windows下 , 自己把自己 激活窗口 [复制链接]

上一主题 下一主题
离线cyberpunker
 

只看楼主 倒序阅读 楼主  发表于: 2017-08-04


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);

}

能把这个函数拆成两个吧?把那一堆函数指针不弄成函数的局部变量? 试了下,编译各种问题


快速回复
限100 字节
 
上一个 下一个