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