私はDelphi(BDS 2006)アプリケーションを持っており、QuickBooks会計ソフトウェアにキーストロークを送信してQuickBooksフォーム(請求書)をトラバースし、現在の編集コントロールからWindowsクリップボードにテキストをコピーし(データを収集するため)、収集したデータに基づいて計算を行います。最後に、キーストロークを送信してフォームに結果を書き込みます。
このアプリケーションは何年にもわたって開発されており、(少なくとも私にとっては)広範なWindows API技術を使用して、フォアグラウンドウィンドウ、フォーカスされたウィンドウなどを識別し、世界中の数十人のユーザーによって使用されています...それが多くのシステムで機能するという証拠として。
すべてではありません。最近、Windows 7システムで多くの障害の報告があります(QuickBooksのバージョンは重要ではないようです)。問題を報告した顧客に送信されたデバッグバージョンは、クリップボードに何もコピーしていないことを示していますが、それでも他のすべてを実行できるようです(フォームをトラバースするためにキーストロークを送信し、計算結果に貼り付けるためにキーストロークを送信します) ...残念ながら、データが収集されなかったため、現在は常にゼロになっています。)
QuickBooksの編集コントロールウィンドウにWM_COPYメッセージを送信するために使用するコードは次のとおりです。(XPまたはWindows 7システムのいずれでも、ここでこのコードを失敗させることはできませんが、複数のユーザーに対しては機能しません。)
var
iResult : DWORD;
begin
...
//Edit control has the focus on the QB form, so try to copy its contents
if SendMessageTimeout(Wnd, WM_COPY, 0, 0,
SMTO_ABORTIFHUNG or SMTO_NORMAL,
2000,
iResult) = 0 then begin //0 = Failed or timed out
//NOTE: Users DO NOT get the following message--the
//SendMessageTimeout() simply returns without error, as if the
//WM_COPY is being sent correctly.
ShowMessage('SendMessageTimeout FAILED');
Abort;
end;
//At this point, the clipboard has nothing on it, on users'
//machines where it fails to work.
...
end;
デバッグバージョンを送信するエンドユーザーの忍耐力を損なうことを望まないので、他の何かを送信して試してみる前に、アイデアを探しています...
メモ/質問:
他のすべてのキーストロークはSendInputを介して送信され、正常に機能します。速度の理由から、キーストロークとしてCtrl-Cを送信する代わりに、SendMessageTimeout(WM_COPY)を使用し始めたと思います。これにより、Ctrl-CがQuickBooksで処理されます。
アプリケーションでRunAs...Administratorを試すようにユーザーに依頼したと思いますが、効果はありませんでした(これが行われたことを確認する必要があります)。
問題がUACの競合に起因するのではないかと思いますか?現在、アプリケーションはデジタル署名されておらず、マニフェストを使用していません。UIAccess=Trueを含むマニフェストの追加について読んでいます。しかし、アプリケーションがすでに問題なくQuickBooksにキーストロークを送信できる場合、UIAccess = Trueを設定すると、SendMessageTimeout()の成功に影響がありますか?また、デジタル証明書を使用する必要がありますか。UIAccess設定を有効にするには?
マニフェストにデジタル署名とUIAccessがないとSendMessageが機能しない場合、Ctrl-Cをキーストロークとして送信することにフォールバックすることは可能ですか?(私はそうは思いません。確かに、Microsoftはセキュリティの概念をめぐるそのエンドランを許可しません。)
私の考えを正すためにコメントをいただければ幸いです...