私はWin7でマウスイベントをシミュレートしようとしています.Webサイトhttp://inputsimulator.codeplex.com/のオープンソースプロジェクト「Windows Input Simulator」を使用して、マウスイベントをシミュレートするために以下のコードを内部的に使用しています。
[DllImport("user32.dll", SetLastError = true)]
public static extern UInt32 SendInput(UInt32 numberOfInputs, INPUT[] inputs, Int32 sizeOfInputStructure);
私のアプリケーションは、Visual Studio 2010 でデバッグすると完全に動作します。左ボタン クリック イベント、右ボタン クリック イベント、およびマウス移動イベントは問題ありません。しかし、.exe アプリケーションの実行可能ファイルをダブルクリックしてエクスプローラーからアプリケーションを起動すると、クリック イベントが送信されません。左ボタンのクリックまたは右クリックをシミュレートしようとすると、アプリケーションは例外を受け取り、終了します。以下のコードで例外がスローされることがわかりました。
public void DispatchInput(INPUT[] inputs)
{
if (inputs == null) throw new ArgumentNullException("inputs");
if (inputs.Length == 0) throw new ArgumentException("The input array was empty", "inputs");
var successful = NativeMethods.SendInput((UInt32)inputs.Length, inputs, Marshal.SizeOf(typeof (INPUT)));
if (successful != inputs.Length)
throw new Exception("Some simulated input commands were not sent successfully. The most common reason for this happening are the security features of Windows including User Interface Privacy Isolation (UIPI). Your application can only send commands to applications of the same or lower elevation. Similarly certain commands are restricted to Accessibility/UIAutomation applications. Refer to the project home page and the code samples for more information.");
}
つまり、UIPI が SendInput(...) をブロックしたということです。だから私はこのトピックをグーグルで調べて、いくつかのアドバイスを得ました.
1) アプリケーションのマニフェストに uiAccess="true" を追加します
<requestedExecutionLevel level="requireAdministrator" uiAccess="true" />
2) テスト証明書を作成し、この証明書をローカル マシンの信頼されたルート証明機関の証明書ストアと信頼された発行元の証明書ストアに追加します。
MakeCert -r -pe -ss PrivateCertStore -n "CN=Test Certificate - For Internal Use Only" testcert.cer
CertMgr.exe /add testcert.cer /s /r localMachine root
CertMgr.exe /add testcert.cer /s /r localMachine trustedpublisher
3) 以前のデジタル署名でアプリケーションに署名する
SignTool sign /v /s PrivateCertStore /n "Test Certificate - For Internal Use Only" /t http://timestamp.verisign.com/scripts/timestamp.dll MyApplication.exe
4) 私のアプリケーションを、コンピューター上の安全な場所の 1 つである "C:\Program Files" フォルダーにインストールします。
UIPI 要件を満たすためにすべてのことを行ったと思いますが、アプリケーションを起動して UAC プロンプトに同意しても問題は解決しません。マウス移動イベントのみOK。
PS: テスト証明書でアプリケーションに署名せず、マニフェストに "requestedExecutionLevel" と uiAccess="true" を追加するだけの場合、アプリケーションは起動せず、Windows は "A referral was returned from the server." というメッセージのダイアログを表示します。テスト証明書でアプリケーションに署名した場合、アプリケーションの起動時に UAC が機能します。SendInput を呼び出してクリック イベントをシミュレートし、例外がスローされるまで、アプリケーションは動作します。
http://msdn.microsoft.com/en-us/library/bb625963.aspxで「Interface Privilege Isolation (UIPI) and integrity」に関する要件を読みましたが、これをすべて実行してもまだ機能しません。
ブログを見つけました。このブログでは、次のように書かれています。
[アプリケーション マニフェストの] requestedPrivileges 属性で UIAccess=”true” を指定することにより、アプリケーションは、特権レベルを超えてウィンドウ メッセージを送信する際の UIPI 制限をバイパスする要件を示しています。Windows Vista は、UIAccess 特権でアプリケーションを起動する前に、次のポリシー チェックを実装します。アプリケーションには、ローカル マシンの信頼されたルート証明機関の証明書ストア内の信頼されたルートに連鎖するデジタル証明書を使用して検証できるデジタル署名が必要です。アプリケーションは、Program Files ディレクトリなど、管理者のみが書き込み可能なローカル フォルダ アプリケーション ディレクトリにインストールする必要があります。
残念ながら、管理者以外のユーザーがアプリケーションをインストールできる場合、これは機能しません。
アプリケーションを最後の文「管理者以外のユーザーがアプリケーションをインストールできる場合、残念ながらこれは機能しません」に準拠させず、マニフェストに uiAccess="true" を追加して UIPI をバイパスする方法を知りたいです。
誰でもこれについて私を助けることができますか?