1

私は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はセキュリティの概念をめぐるそのエンドランを許可しません。)

私の考えを正すためにコメントをいただければ幸いです...

4

2 に答える 2

4

これは、UACではなく「ユーザーインターフェイス特権の分離」(UIPI)に関連している可能性があります。各プロセスの整合性レベルを確認してください。整合性の低いプロセスは、整合性の高いプロセスがを呼び出して明示的に許可しない限り、整合性の高いプロセスにウィンドウメッセージを送信することはできませんChangeWindowMessageFilter/Ex()

于 2012-12-07T22:44:16.850 に答える
0

Internet Explorer用のこのシステムSkypeプラグインをチェックインできますか(IE-オプション-プログラム-アドオン)。クリップボードのデータを台無しにするこのプラグインのバグのあるバージョンがあります。このプラグインがインストールされている場合は、削除してテストします。

于 2012-12-08T08:54:00.410 に答える