喫茶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;


[13019] Re:キー押下のエミュレート返信 削除
2019/8/6 (火) 17:45:50 Mr.XRAY
[ 仮想キーコードの送信方法 ]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201907/19070005.txt

>※キー送信の合間に別の処理を挟みたいので、PostMessageの使用は考えて
> おりません。(処理の順番が狂ってしまうため)


だから SendNessage を使うということてすが,
これはちょっと違うというか,違和感があります.本人の思い込みでしょう.
そのような問題が発生するとすれば,それはコーディングも問題でしょう.

その内容だけとつまらないので,記事構成を考え付いたらサンプルを作成して UP
したいと思っています.

※ 当然ですが WM_KEYDOWN, WM_KEYUP で SendMessage を使用することは考えられません.


[13031] サンプル記事UPしました返信 削除
2019/8/10 (土) 12:33:26 Mr.XRAY
> その内容だけとつまらないので,記事構成を考え付いたらサンプルを作成して UP
> したいと思っています.


以下のサンプルを追加しました.

[ 671_他のアプリへキー操作を送信 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/671_EmulateKeyPress.htm

[ 702_PostMessage 関数と SendMessage 関数 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/702_PostMessage_SendMessage.htm


> ※キー送信の合間に別の処理を挟みたいので、PostMessageの使用は考えて
> おりません。(処理の順番が狂ってしまうため)


という問題ではないということです.

> Keybd_eventの使用は考えておりません。

ということは他のアプリのキー送信のエミュレートはできないということになります.


※ サンプル記事の追加により,以下のファイルは削除しました.
  http://mrxray.on.coocan.jp/Delphi/zip/QandA_20190728_Emulate_KeyEvent.zip


[13032] Re:サンプル記事UPしました返信 削除
2019/8/12 (月) 14:22:27 Mr.XRAY
> という問題ではないということです.

PostMessage を使用すべきメッセージは PostMessage を使用しないと
正常な動作は期待できないという意味です.
処理待ちにしたいから SendMessage を使用するという問題ではありません.

ただし,WM_APP のユーザ定義のメッセージは特別です.
自分で処理コードを作成するのですからどうにでもなります.


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