喫茶XRAYトップページ

[スレッド全体
]

[13008] キー押下のエミュレート返信 削除
2019/7/29 (月) 20:31:30 Mr.XRAY
[ 仮想キーコードの送信方法 ]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201907/19070005.txt

>エンターキーは送信されません。

キーコードは送信されています.
Enter キーの押下としては機能していないだけです.
以下で確認できます.

//=============================================================================
//  SendMessage でキーコードを送る
//=============================================================================
procedure TReceivForm.Button1Click(Sender: TObject);
begin
  Memo1.Clear;

  SendMessage(Memo1.Handle, WM_KEYDOWN, VK_RETURN, 0);
  SendMessage(Memo1.Handle, WM_KEYUP,   VK_RETURN, 0);

  SendMessage(Memo1.Handle, WM_KEYDOWN, VK_Shift, 0);
  SendMessage(Memo1.Handle, WM_KeyDown, VK_LEFT,  0);
  SendMessage(Memo1.Handle, WM_KEYUP,   VK_LEFT,  0);
  SendMessage(Memo1.Handle, WM_KEYUP,   VK_Shift, 0);
end;

//=============================================================================
//  PostMessage でキーコードを送る
//  PostMessage はメッセージキューにポストする
//  この場合はキーの情報をポストする
//=============================================================================
procedure TReceivForm.Button2Click(Sender: TObject);
begin
  Memo1.Clear;

  PostMessage(Memo1.Handle, WM_KEYDOWN, VK_RETURN, 0);
  PostMessage(Memo1.Handle, WM_KEYUP,   VK_RETURN, 0);

  PostMessage(Memo1.Handle, WM_KEYDOWN, VK_Shift, 0);
  PostMessage(Memo1.Handle, WM_KeyDown, VK_LEFT,  0);
  PostMessage(Memo1.Handle, WM_KEYUP,   VK_LEFT,  0);
  PostMessage(Memo1.Handle, WM_KEYUP,   VK_Shift, 0);
end;

//=============================================================================
//  Memo1 の OnKeyDown イベント処理
//=============================================================================
procedure TReceivForm.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Memo1.Lines.Add('OnKeyDown  $' + IntToHex(Key, 4));
end;

//=============================================================================
//  Memo1 の OnKeyup イベント処理
//=============================================================================
procedure TReceivForm.Memo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Memo1.Lines.Add('OnKeyUp  $' + IntToHex(Key, 4));
end;

//=============================================================================
//  ApplicationEvents1 の OnMessage イベント処理
//  WM_KEYDOWN, WM_KEYUP 等はメッセージキューにポストされた値を取得する
//  メッセージキューにポストするには PostMessage を使用する
//  SendMessage はメッセージキューにはポストしない
//=============================================================================
procedure TReceivForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  Ltext : string;
begin
  if Msg.hwnd = Memo1.Handle then begin
    if Msg.message = WM_KEYDOWN then begin
      Ltext := 'WM_KEYDON  $'
             + IntToHex(Msg.wParam, 4)
             + '  $' + IntToHex(Msg.lParam, 4);;
      Memo1.Lines.Add(Ltext);
    end else
    if Msg.message = WM_KEYUP then begin
      Ltext := 'WM_KEYUP  $'
             + IntToHex(Msg.wParam, 4)
             + '  $' + IntToHex(Msg.lParam, 4);;
      Memo1.Lines.Add(Ltext);
    end;
  end;
end;


[13009] Re:キー押下のエミュレート返信 削除
2019/7/29 (月) 20:33:10 Mr.XRAY
WM_KEYDOWN 等は lParam の指定がないと単にキーコードを送信するだけです.
キーイベントとするには lParam の値を設定します.
Shift キー等の組み合わせの時はその情報を lParam に格納しておきます.
WM_KEYDOWN 等メッセージを受信した時に Shift キー等を検出するコードを書くことがあります.
そのことを思い出してください.
送信には PostMessage を使用します.

以下の ZIP ファイルは昔テストしたコードを整備したものです.
Swiss Delphi Center に掲載されていたコードを利用しています.
Swiss Delphi Center です.懐かしいと思う方がいるかも.
今日現在も記事が存在することを確認しました.

http://mrxray.on.coocan.jp/Delphi/zip/QandA_20190728_Emulate_KeyEvent.zip
(EXE + ソースコード.説明なし)

某掲示板の場合は以下のようになります.

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

//=============================================================================
//  PostMessage でキー操作を実行
//  単なるキーコードのポストではない
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  PostKeyExHWND(Memo1.Handle, VK_RETURN, [], False);
  Memo1.SelStart := 7;
end;

//=============================================================================
//  PostMessage でキー操作を実行
//  単なるキーコードのポストではない
//=============================================================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  PostKeyExHWND(Memo1.Handle, VK_LEFT, [ssShift], False);
end;

正直なところ,keybd_event 関数を使用した方が簡単で確実です.
と思います.個人的には.


[13010] Re2:キー押下のエミュレート返信 削除
2019/7/29 (月) 20:35:35 Mr.XRAY
▼ Mr.XRAYさん

>  送信には PostMessage を使用します.

今回提示した程度のコードであれば SendMessage でも問題が発生することはないと思います.


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