喫茶XRAYトップページ

[スレッド全体
]

[13012] Re3:キー押下のエミュレート返信 削除
2019/7/30 (火) 12:03:05 Mr.XRAY
> プロセス超えの通信では正常に機能しません.

キー操作の情報はキーバッファに格納されます.
このバッファはメモリです.
他のアプリ,つまり他のプロセスから見れば送信側のプロセスのメモリです.
したがって,他のアプリからはキー押下としての情報処理が正しくできないことがあります.
キーコードそのものは他のアプリでも取得できます.

このことから SendMessage ではキー押下としての処理ができないことがあります.

http://chokuto.ifdef.jp/urawaza/message/WM_KEYDOWN.html

に lParam の詳しい説明がありますが,この説明にしたがって lParam の値を設定すれば
キー押下としての情報がバッファに格納されるわけではありません.
PostKeyExHWND 関数のコードのように,意図的にバッファに情報を格納する必要があります.


[13013] Re4:キー押下のエミュレート返信 削除
2019/7/31 (水) 09:37:49 Mr.XRAY
>http://mrxray.on.coocan.jp/Delphi/zip/QandA_20190728_Emulate_KeyEvent.zip
>(EXE + ソースコード.説明なし)


ものはついてですので keybd_event 関数を使用したサンプルを追加しておきました.


//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := '日本語 ABC テスト XYZ';
  Memo1.SelStart := 7;
end;

//=============================================================================
//  keybd_event 関数を使用したキー操作のエミュレート
//  [Enter]
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Memo1.SetFocus;

  keybd_event(VK_RETURN, 0, 0, 0);
  keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
end;

//=============================================================================
//  keybd_event 関数を使用したキー操作のエミュレート
//  [Shift] + [←]
//=============================================================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  Memo1.SetFocus;

  keybd_event(VK_SHIFT, 0, 0, 0);
  keybd_event(VK_LEFT,  0, KEYEVENTF_EXTENDEDKEY, 0);
  keybd_event(VK_LEFT,  0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end;


[13014] 他のアプリへのキー操作を送信返信 削除
2019/7/31 (水) 12:38:19 Mr.XRAY
受信側のアプリも自分で開発する場合であれば,
他のアプリにフォーカスを移動しないで,
他のアプリへキー操作を送信する方法が全くないわけではありません.

[650] [02_レコード型の場合]
http://mrxray.on.coocan.jp/Delphi/plSamples/650_SendText.htm#02

のサンプルの方法が使用できます.
送信側は例えば以下のようします.
テータを受け取ったアプリ側では,このデータを元に WM_KEYDOWN, WM_KEYUP メッセージを
目的のコントロールに PostMessage します.
これも UP した ZIP 書庫に追加しておきました.


type
  TKeyDataInfo = record
    Key  : Byte;
    shift: TShiftState
  end;

//=============================================================================
//  キー押下データの送信
//  [Enter]
//=============================================================================
procedure TSenderForm.Button1Click(Sender: TObject);
var
  LKeyData  : TKeyDataInfo;
  LCopyDS   : TCopyDataStruct;
  LhWindow  : HWND;
begin
  LKeyData.Key   := VK_RETURN;
  LKeyData.shift := [];

  //受取る側のウィンドウハンドル
  LhWindow := FindWindow('TReceivForm', nil);
  if LhWindow = 0 then exit;

  LCopyDS.dwData := 1234; //適当な値
  LCopyDS.cbData := SizeOf(LKeyData);
  LCopyDS.lpData := Addr(LKeyData);

  SendMessage(LhWindow, WM_COPYDATA, Handle, LPARAM(Addr(LCopyDS)));
end;

//=============================================================================
//  キー押下データの送信
//  [Shft] + [←]
//=============================================================================
procedure TSenderForm.Button2Click(Sender: TObject);
var
  LKeyData  : TKeyDataInfo;
  LCopyDS   : TCopyDataStruct;
  LhWindow  : HWND;
begin
  LKeyData.Key   := VK_LEFT;
  LKeyData.shift := [ssShift];

  //受取る側のウィンドウハンドル
  LhWindow := FindWindow('TReceivForm', nil);
  if LhWindow = 0 then exit;

  LCopyDS.dwData := 1234; //適当な値
  LCopyDS.cbData := SizeOf(LKeyData);
  LCopyDS.lpData := Addr(LKeyData);

  SendMessage(LhWindow, WM_COPYDATA, Handle, LPARAM(Addr(LCopyDS)));
end;


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82