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

解決


スナフキン  2003-10-25 23:44:25  No: 5420  IP: [192.*.*.*]

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

編集    削除
LupinⅢ  URL  2003-10-26 09:29:35  No: 5421  IP: [192.*.*.*]

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

編集    削除
にしの  2003-10-26 19:34:40  No: 5422  IP: [192.*.*.*]

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

キーを押したことにするのは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  IP: [192.*.*.*]

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

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

編集    削除
スナフキン  2003-10-26 20:02:46  No: 5424  IP: [192.*.*.*]

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

編集    削除
にしの  2003-10-26 20:13:16  No: 5425  IP: [192.*.*.*]

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

編集    削除
スナフキン  2003-10-27 17:03:57  No: 5426  IP: [192.*.*.*]

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

編集    削除
にしの  2003-10-27 18:32:30  No: 5427  IP: [192.*.*.*]

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  IP: [192.*.*.*]

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

編集    削除