外部ウィンドウにボタンやその他のものを描画するには、外部プロセスにコードを挿入する必要があります。そのための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());
グローバル フックをインストールすると、すべてのプロセスに DLL が挿入されるため、デバッグが非常に難しくなり、使用中の DLL は書き込み禁止になる可能性があります。