Teamviewers Quickconnect按钮是如何完成的?

Dan*_*cek 11 c++ qt titlebar button

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

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

谢谢.

Mar*_*ark 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);
}
Run Code Online (Sandbox Code Playgroud)

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

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, NULL, GetCurrentThreadId());
Run Code Online (Sandbox Code Playgroud)

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