对于那些不知道我在说什么的人: http ://www.teamviewer.com/images/presse/quickconnect_en.jpg
Teamviewer 会在所有窗口上覆盖该按钮,以允许您快速与其他人共享窗口。我想要任何关于实现类似东西的想法——如果你有示例代码,甚至更好(特别是按钮——而不是共享)。我对 C++ 和 QT 很感兴趣……但如果有的话,我会对其他语言/库中的好的解决方案感兴趣。
谢谢。
对于那些不知道我在说什么的人: http ://www.teamviewer.com/images/presse/quickconnect_en.jpg
Teamviewer 会在所有窗口上覆盖该按钮,以允许您快速与其他人共享窗口。我想要任何关于实现类似东西的想法——如果你有示例代码,甚至更好(特别是按钮——而不是共享)。我对 C++ 和 QT 很感兴趣……但如果有的话,我会对其他语言/库中的好的解决方案感兴趣。
谢谢。
要在外部窗口中绘制按钮或其他内容,您需要将代码注入外部进程。检查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 在使用时可能会受到写保护。