Dan*_*cek 11 c++ qt titlebar button
对于那些不知道我在说什么的人: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的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在使用时可能会被写保护.
归档时间: |
|
查看次数: |
3377 次 |
最近记录: |