IEを起動すると、大抵は保護モードで実行される。
この『
インストーラーなど管理者モードになっているプロセスから起動すると
そうすると、IEは2つのモードで実行される可能性があることになる…。
この場合、保護モードや一般ユーザーモードで実行されているプロセスからは管理者モードのプロセスにはアクセスできなくなる。
特に SendMessage や PostMessage を使っている場合、エラーが発生せずに送ったメッセージは破棄される。
IEの拡張機能から CreateProcess APIでEXEを実行してSendMessageなどのウィンドウメッセージ機能で通信を行おうとすると、すべて上手くいかない orz
これも、互いのプロセストークンのレベルが違うために起こる。
この場合、起動側のトークンを取得して CreateProcessAsUser APIでEXEを実行すると同じプロセストークンのレベルで起動されるので、行き来可能になる。
管理者モード → 一般 or 保護モード への SendMessage や PostMessage は可能だが 一般 or 保護モード → 管理者モード への SendMessage や PostMessage は無効になる。
この機能は UIPI に依るもの。
では、これをどう解決したらいいのか…。
ChangeWindowMessageFilter というAPIを使うらしい。
ChangeWindowMessageFilter は 一般 or 保護モード → 管理者モード でのウィンドウメッセージにおいて通過させるものを登録することができる(解除も可)。
ChangeWindowMessageFilter(WM_USER + 0x0010, MSGFLT_ADD); // WM_USER + 0x0010 というメッセージを通過させる
ChangeWindowMessageFilter(WM_USER + 0x0010, MSGFLT_REMOVE); // WM_USER + 0x0010 というメッセージを通過させない
上記コードを管理者モード側のプロセスで実行しておけば任意のメッセージを受け取ることが可能。
ちなみに、WM_USER以上のメッセージに限るらしい。