0

Google Chromeでは、ダイアログを開いてダイアログでCTRL-Cを実行するだけで、JavaScriptアラート/ダイアログのテキストを取得できます。これにより、ダイアログ内のテキストがクリップボードに配置されます。

SendMessageを使用してCTRL-Cを送信し、JavaScriptダイアログのテキストのコピーを実行しようとしています。私はすでにSendInputを使用してこれを行うことができましたが、残念ながら、ウィンドウにフォーカスがない場合は失敗する可能性があります。

WM_COPYメッセージでSendMessageを使用しようとしましたが、それは私のニーズにはうまくいきませんでした。

SendMessageを正常に使用する前に誰かがこれを行ったことがある場合は、ご協力いただければ幸いです。

4

4 に答える 4

1

WM_COPY が失敗した場合、いくつかの方法を試すことができます...

キープレスを偽造するには、WM_KEYDOWN および WM_KEYUP メッセージを送信できます。

しかし、あなたはメッセージで何を送りますか?「c」を送信した場合、これらのメッセージでアプリケーションに ctrl も押されたことを通知する方法はありません。

文字 0x03 (ctrl+c が実際に生成する文字コード) を送信できる場合がありますが、受信アプリケーションがこれを「ctrl+c」アクションとして解釈するという保証はありません。

うまくいかないのはなぜですか?受信アプリケーションは...

  • WM_KEYDOWN と WM_KEYUP を無視し、他の手段を使用してキーボードを読み取ります (たとえば、GetAsyncKeyState を使用してキーが押されているかどうかを確認します)。
  • WM_KEYDOWN および/または WM_KEYUP メッセージを処理しますが、"c" を探してから GetAsyncKeyState() などを使用して、メッセージの処理時に ctrl が押されているかどうかを検出します。
  • 入力フォーカスがない場合はメッセージを無視するか、さらに悪いことに、それらのメッセージを入力フォーカス ウィンドウから受信したかのように処理する可能性があります。

試してみてください。ただし、うまくいかない場合があります。

別の方法として、SendInput が機能する場合は、入力フォーカスを正しいコントロール SendInput に強制してから、入力フォーカスを以前の場所に戻すことができます。

別のアプローチ (おそらく最良の方法) は、それが既知のダイアログであり、静的テキスト フィールドが含まれている場合、その子コントロールとその上の GetText を見つけ (WM_GETTEXT メッセージを送信)、クリップボードの使用を避けることができる場合があります。まったく。(または、クリップボードにテキストが必要な場合は、このように取得してから、自分でクリップボードに配置します)。これにより、アプリケーションをだましてテキストを提供させることが回避され、標準の Windows の動作に戻ります。

于 2010-04-01T21:32:05.900 に答える
0

これらを使ってみてください

WM_CUT = 0x300
WM_COPY = 0x301
WM_PASTE = 0x302
WM_CLEAR = 0x303

操作に応じて wmsg パラメータとして。

于 2010-04-01T21:11:05.620 に答える
0

プロセスを終了するために Ctrl+C キーストロークを送信することについて話しているのか、それとも選択をクリップボードにコピーすることについて話しているのかについて、質問は少しあいまいです。前者の場合は、OPがシェルプロセスを終了するためにCtrl + Cキーストロークを送信する方法を尋ねていた、以前に尋ねられたSOのこちらこちらの回答を参照してください。

選択範囲をクリップボードにコピーするための Ctrl+C について話している場合、クリップボードにコピーする前に選択範囲が実際に最初に選択されているかどうかについてはさらに注意が必要です...

少なくとも、私が間違った角度から外れている場合は、質問を編集してより明確にしてください。

于 2010-04-01T21:12:48.933 に答える
-1

これは古くからの質問であることは承知していますが、満足のいく回答が得られていないことを考えると、他の人が探していることをお許しください。

SendMessage()必須ではありません。単純に使用します:

System.Windows.Forms.SendKeys.SendWait("^(c)");

そして、貼り付けたい場合:

System.Windows.Forms.SendKeys.SendWait("^(v)");
于 2016-03-21T15:57:26.867 に答える