11

何を言っているかわからない人のために: http://www.teamviewer.com/images/presse/quickconnect_en.jpg

Teamviewer はそのボタンをすべてのウィンドウにオーバーレイして、ウィンドウを他の人とすばやく共有できるようにします。似たようなものを実装するためのアイデアが欲しいです-サンプルコードがあれば、さらに良いです(具体的には、ボタン-共有ではありません)。私は C++ と QT に興味がありますが、他の言語やライブラリの良い解決策があれば興味があります。

ありがとう。

4

1 に答える 1

7

外部ウィンドウにボタンやその他のものを描画するには、外部プロセスにコードを挿入する必要があります。そのための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 は書き込み禁止になる可能性があります。

于 2012-08-30T14:28:25.400 に答える