Teamviewer Quickconnect按钮是如何完成的?

时间:2012-08-16 23:21:44

标签: c++ qt button titlebar

对于那些不知道我在说什么的人: http://www.teamviewer.com/images/presse/quickconnect_en.jpg

Teamviewer覆盖所有窗口上的该按钮,以便您与其他人快速共享窗口。我想要实现类似的任何想法 - 如果你有示例代码,甚至更好(特别是按钮 - 而不是共享)。我对C ++和QT感兴趣...但如果有的话,我会对其他语言/库中的好解决方案感兴趣。

感谢。

1 个答案:

答案 0 :(得分:7)

要在外部窗口中绘制按钮或其他内容,您需要将代码注入外部进程。 检查SetWindowsHookEx方法:

你很可能想为WH_CALLWNDPROCRET安装一个钩子,并注意WM_NCPAINT消息。这将是绘制按钮的正确位置。 但是,我不确定,如果你可以在非客户区内放置一个窗口,那么在最坏的情况下,你必须“手动”绘制按钮。

只需从主应用程序(或从DLL中)调用此文件

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, hModule, 0);

请注意,myCallWndRetProc必须位于DLL中,而hModule是此DLL的Module-HANDLE。

您的myCallWndRetProc可能如下所示:

LRESULT CALLBACK myCallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HT_ACTION) {
        CWPRETSTRUCT* cwpret = (CWPRETSTRUCT*)lParam;
        if (cwpret->message == WM_NCPAINT) {
            // The non-client area has just been painted.
            // Now it's your turn to draw your buttons or whatever you like
        }
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

从实现开始,我建议,您只需创建一个简单的对话框应用程序并仅挂钩您自己的进程:

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, NULL, GetCurrentThreadId());

安装全局钩子会将DLL注入所有进程,这会使调试变得非常困难,并且在使用DLL时可能会对DLL进行写保护。