11

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

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

谢谢。

4

1 回答 1

7

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

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

只需从您的主应用程序(或从 DLL 中)调用它

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, hModule, 0);

请注意,myCallWndRetProc 必须驻留在 DLL 中,而 hModule 是此 DLL 的模块句柄。

您的 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 在使用时可能会受到写保护。

于 2012-08-30T14:28:25.400 回答