1
    uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK");
    WinApi.RegisterShellHookWindow(this.Handle);

私のフォームコンストラクターで

そしてこれは私のオーバーライドされたWndProcにあります:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    IntPtr handle;
    if (m.Msg == uMsgNotify)
    {
        switch (m.WParam.ToInt32())
        {
            case WinApi.HSHELL_WINDOWCREATED:
                handle = m.LParam;
                string windowName = GetWindowName(handle);
                MessageBox.Show(windowName+" "+handle.ToString());
                break;
            case WinApi.HSHELL_WINDOWDESTROYED:
                handle = m.LParam;
                MessageBox.Show(handle.ToString());
                break;
        }
    }
    base.WndProc(ref m);
}

したがって、デフォルトの Windows シェルが explorer.exe の場合、この Win フォームは正常に動作します。すべてのイベントを取得できます作成​​および破棄されたすべてのウィンドウとその名前。app.exe をデフォルトの Windows シェルとして設定すると。メッセージを受信しません。

dll 関数インジェクション、フック用の個別の dll ファイルを使用する必要がありますか? 私はより簡単で簡単な解決策を得ようとしていました。

何か案は?

ありがとう

4

1 に答える 1

3

WH_SHELLドキュメントには明示的に次のように記載されています。

カスタム シェル アプリケーションはメッセージ を受信しないことに注意してください。WH_SHELLしたがって、既定のシェルとして自身を登録するアプリケーションは、そのアプリケーションSystemParametersInfo (または他のアプリケーション) がWH_SHELL メッセージを受信する前に関数を呼び出す必要があります。SPI_SETMINIMIZEDMETRICSこの関数は、 構造体とともに呼び出す必要がありますMINIMIZEDMETRICS。この構造体のiArrangeメンバーを ARW_HIDE に設定し ます。

于 2010-12-28T07:52:17.500 に答える