Как работает кнопка Quickconnect Teamviewers?

Для тех из вас, кто не знает, о чем я говорю: http://www.teamviewer.com/images/presse/quickconnect_en.jpg

Teamviewer накладывает эту кнопку на все окна, чтобы вы могли быстро обмениваться окном с кем-то другим. Мне бы хотелось, чтобы любые идеи по реализации чего-то подобного - если у вас есть пример кода, еще лучше (в частности, кнопка - не разделение). Меня интересуют С++ и QT... но меня бы интересовали хорошие решения в других языках/библиотеках, если они есть.

Спасибо.

Ответ 1

Чтобы нарисовать кнопки или другие вещи в чужих окнах, вам нужно ввести код в чужие процессы. Проверьте метод SetWindowsHookEx:

Скорее всего, вы захотите установить hook для WH_CALLWNDPROCRET и следить за сообщением WM_NCPAINT. Это будет подходящее место, чтобы нарисовать вашу кнопку. Тем не менее, я не уверен, если вы можете разместить окно внутри области без клиентов, поэтому в худшем случае вам придется нарисовать кнопку "вручную".

Просто вызовите это из основного приложения (или из библиотеки DLL)

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, hModule, 0);

Обратите внимание, что myCallWndRetProc должен находиться внутри DLL, а hModule - это модуль-HANDLE для этой 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 your turn to draw your buttons or whatever you like
        }
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

Когда вы начнете с своей реализации, я бы предложил, вы просто создаете простое диалоговое приложение и можете использовать только собственный процесс:

SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, NULL, GetCurrentThreadId());

Установка глобального хоста внедряет DLL во все процессы, что делает отладки довольно сложной, и ваша DLL может быть защищена от записи во время ее использования.