フォームにbuttonを貼り付けてそれを押すと指定したキーボードのあるキーを押したのと同じ結果を得たいのです。
可能なのでしょうか。教えてください。
もう少し細かく説明したほうがレスがかえってくると思いますよ。
キーボードを押した時の文字入力だとか・・・。
私が想像したものと、やりたいことは別だとは思いますが、一応レスします。
キーを押したことにするのは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などの、キーに関するメッセージを自前で送らなければなりません。
1つ書き忘れました。
> 上のコードでAを押したことにすると、ボタンに対してWM_KEYDOWN, WM_KEYUP, WM_CHARが飛ぶので、ボタンで処理しなければなりません。
フォーカスを、事前に変更しておけば、キー'A'は変更後のフォーカスのあるウィンドウへ送られます。
コンパイルエラーで「未定義の識別子:'VK_A'とになってしまうのですが、なにか宣言みたいのをするのでしょうか?
にしの様ありがとうございます。
失礼しました。
'VK_A'は、Ord('A')です。
VK_SHIFTなどの定義はありますが、文字コードを持つものは、基本的に文字コードそのままです。
# アルファベットは大文字の文字コードを使用します。
うまくいきました。
もうひとつお願いしたいのですが、例えばショートカットキーを押したように同時に二つのキーを押したことにするにはどうすればいいでしょうか。
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
このあたりを参考にしてみてください。
にしの様!!本当にありがとうございました。
無事解決しました。
ツイート | ![]() |