Как выполняется кнопка Teamviewers Quickconnect?
для тех из вас, кто не знает, что я говорю о: http://www.teamviewer.com/images/presse/quickconnect_en.jpg
Teamviewer накладывает эту кнопку на все окна, чтобы вы могли быстро поделиться окном с кем-то другим. Я хотел бы любые идеи по реализации чего-то подобного-если у вас есть пример кода, даже лучше (в частности, кнопка-не общий доступ). Меня интересуют C++ и QT... но я был бы заинтересован в хороших решениях в других языки / библиотеки, если они есть.
спасибо.
1 ответов
чтобы рисовать кнопки или другие вещи во внешних окнах, вам нужно ввести код во внешние процессы. Проверьте 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());
установка глобальных hook вводит DLL во все процессы, что делает отладку довольно сложной, и ваша DLL может быть защищена от записи во время ее использования.