キーを押したのと同じ結果を得るには?

解決


スナフキン  2003-10-25 23:44:25  No: 5420

フォームにbuttonを貼り付けてそれを押すと指定したキーボードのあるキーを押したのと同じ結果を得たいのです。
可能なのでしょうか。教えてください。


LupinⅢ  URL  2003-10-26 09:29:35  No: 5421

もう少し細かく説明したほうがレスがかえってくると思いますよ。
キーボードを押した時の文字入力だとか・・・。


にしの  2003-10-26 19:34:40  No: 5422

私が想像したものと、やりたいことは別だとは思いますが、一応レスします。

キーを押したことにするのはkeybd_eventというAPIを使用します。
たとえば、ボタンが押されたら、
keybd_event(VK_A, 0, 0, 0);
keybd_event(VK_A, 0, KEYEVENTF_KEYUP, 0);
とすれば、Aを押したことになります。

ただし(ここが重要)。
「ボタンを押すと、キーを押したのと同じ結果」ということは、ボタンにフォーカスがある状態で、キーを押すことになります。
上のコードでAを押したことにすると、ボタンに対してWM_KEYDOWN, WM_KEYUP, WM_CHARが飛ぶので、ボタンで処理しなければなりません。
また、keybd_eventは、あくまでもキーのシミュレーションですから、キーを押している最中に他のウィンドウにフォーカスを当てたりすれば、キーの送信先も変わります。

もし、マウスで操作されても、決められたウィンドウにキーを送信したいのであれば、WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSCOMMAND, WM_IMECHARなどの、キーに関するメッセージを自前で送らなければなりません。


にしの  2003-10-26 19:36:02  No: 5423

1つ書き忘れました。
> 上のコードでAを押したことにすると、ボタンに対してWM_KEYDOWN, WM_KEYUP, WM_CHARが飛ぶので、ボタンで処理しなければなりません。

フォーカスを、事前に変更しておけば、キー'A'は変更後のフォーカスのあるウィンドウへ送られます。


スナフキン  2003-10-26 20:02:46  No: 5424

コンパイルエラーで「未定義の識別子:'VK_A'とになってしまうのですが、なにか宣言みたいのをするのでしょうか?
にしの様ありがとうございます。


にしの  2003-10-26 20:13:16  No: 5425

失礼しました。
'VK_A'は、Ord('A')です。
VK_SHIFTなどの定義はありますが、文字コードを持つものは、基本的に文字コードそのままです。
# アルファベットは大文字の文字コードを使用します。


スナフキン  2003-10-27 17:03:57  No: 5426

うまくいきました。
もうひとつお願いしたいのですが、例えばショートカットキーを押したように同時に二つのキーを押したことにするにはどうすればいいでしょうか。


にしの  2003-10-27 18:32:30  No: 5427

keybd_eventは、「キーイベントをシミュレートする」APIです。

keybd_event(Ord('A'), 0, 0, 0);
がAを押すシミュレート、

keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0);
が、Aを離すシミュレートです。

例えば、Ctrl+Cとしたいのであれば、
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(Ord('C'), 0, 0, 0);
keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
となります。
# つまり、Ctrlを押し、Cを押し、Cを離し、Ctrlを離す。

仮想キーのキーコードは、
http://black.sakura.ne.jp/~third/system/winapi/win32.html
このあたりを参考にしてみてください。


スナフキン  2003-10-27 19:16:09  No: 5428

にしの様!!本当にありがとうございました。
無事解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加