Как выполняется кнопка 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 может быть защищена от записи во время ее использования.