对于那些不知道我在说什么的人: http://www.teamviewer.com/images/presse/quickconnect_en.jpg
Teamviewer覆盖所有窗口上的该按钮,以便您与其他人快速共享窗口。我想要实现类似的任何想法 - 如果你有示例代码,甚至更好(特别是按钮 - 而不是共享)。我对C ++和QT感兴趣...但如果有的话,我会对其他语言/库中的好解决方案感兴趣。
感谢。
答案 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进行写保护。