-1

Delphi アプリケーション (myapp.exe) から別のアプリケーション (target.exe) に複数の仮想キー (VK_RETURN) を送信する必要があります。 Eg : Send VK_RETURN twice , from myapp.exe , into target.exe

私が使用しているOSはWindows 7 64ビットとWindows XPです。

私は読んだ:「ENTER」キーの押下を別のアプリケーションに送信する方法は?Ctrl +キーをサードパーティアプリケーションに送信し(私には機能しませんでした)、その他の以前に尋ねられた質問。しかし、まだ私は混乱しています。

ターゲット アプリケーションにフォーカスを設定する方法は?

対象のアプリケーションに仮想キーを送信する方法は?

簡単な例: VK_RETURN を、notepad.exe または calc.exe (既にロードされている)、または Delphi アプリケーションから他のプログラムに 2 回送信したいと考えています。どうやってするか ?

Delphi 2010 でこれを行う最も簡単な方法を教えてください...

PS : http://delphi.about.com/od/adptips2004/a/bltip1104_3.htmから SndKey32.pass を試してみたところ、 エラーが発生しました: [DCC エラー] SndKey32.pas(420): E2010 互換性のない型: 'Char' および'AnsiChar'

  If (Length(KeyString)=1) then MKey:=vkKeyScan(KeyString[1])
4

1 に答える 1

4

ターゲット アプリケーションがフォアグラウンド ウィンドウでない場合は、 を使用PostMessageしてキーストロークをそのウィンドウ ハンドルに送信する必要があります。を使用してそのウィンドウ ハンドルを取得できますFindWindow。以下のコードEnterは、メモ帳の実行中のインスタンスのテキスト領域にキーを送信します (FindWindowEx最初にメモ領域を見つけるために追加を使用していることに注意してください)。Windows 7 64 で Delphi 2007 と Delphi XE4 (32 ビット ターゲット) の両方を使用してテストされました。

uses Windows;
    
procedure TForm1.Button1Click(Sender: TObject);
var
  NpWnd, NpEdit: HWnd;
begin
  NpWnd := FindWindow('Notepad', nil);
  if NpWnd <> 0 then
  begin
    NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
    if NpEdit <> 0 then
    begin
      PostMessage(NpEdit, WM_KEYDOWN, VK_RETURN, 0);
      PostMessage(NpEdit, WM_KEYUP, VK_RETURN, 0); 
    end;
  end;
end;

代わりにタイトル (キャプション) でウィンドウを検索するには、2 番目のパラメーターをFindWindow. これは、デフォルトの「無題」ファイルが開いているメモ帳の新しいインスタンスを見つけます。

NpWnd := FindWindow(nil, 'Untitled - Notepad');

これには、ウィンドウ タイトルが完全に一致する必要があることに注意してください。たとえば、の前後に余分なスペース-があると、一致が失敗し、ウィンドウ ハンドルが取得されません。

複数のインスタンスを実行している場合は、ウィンドウ クラスとタイトルの両方を使用できます。Readme.txtロードされた状態で実行されているメモ帳のコピーを見つけるには、次を使用します

NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');

他のアプリケーションを見つけるには、WinSpy や WinSight などを使用してウィンドウ クラス名を見つける必要があります。(Winspector や WindowsDowse (どちらも Delphi で記述されています) など、他にもあります)。

あなたのコメントは言及していますCalculator; Winspector によると、Calculatorメイン ウィンドウはCalcFrameWindows 7 で呼び出されるウィンドウ クラスにあり、数字が表示される領域はStaticウィンドウです (つまり、キーストロークを直接受け取らないようです)。ボタンは単純に と呼ばれるため、ハンドルを取得するには、個々のボタンを探してボタンを識別し、Buttonそれらをループ処理する必要があります。EnumChildWindows

(子ウィンドウを列挙する方法は別の質問です。ここまたは Google で検索すると、おそらく例を見つけることができます。それができない場合は、それに関する新しい別の質問を投稿してください。回答を得ることができます。)

これは、ウィンドウ クラスでキーを見つけた後、電卓にキーを送信する簡単な例です。さまざまなボタンとそれぞれが応答するキー (およびメッセージの適切な組み合わせ) を識別するのに時間がかかるため、何も役に立ちません。このコード11Numpad+22は、電卓ウィンドウに送信するだけです (簡単なテストでは、それらが適切に受信されて表示されることが示されました。それは、私がプロセスに費やしたかったすべての時間です)。

uses Windows;

procedure TForm1.Button1Click(Sender: TObject);
var
  NpWnd: HWnd;
begin
  NpWnd := FindWindow('CalcFrame',  nil);
  if NpWnd <> 0 then
  begin
    PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD1, 0);
    PostMessage(NpWnd, WM_KEYDOWN, VK_ADD, 0);
    PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD2, 0);
  end;
end;
于 2013-08-10T17:02:43.847 に答える