お世話になります。
Delphi5/WinNTで作成したアプリをWinXPで動作させようとしているのですが、
keybd_eventを使用して[Shit+右キー]を発生させ、範囲を指定させるのに、
WindowsNT版アプリでは
keybd_event(VK_SHIFT, 0, 0, 0); //シフトキー押下
keybd_event(VK_RIGHT, 0, 0, 0); //→キー押下
keybd_event(VK_RIGHT, 0, KEYEVENTF_KEYUP, 0); //→キー戻す
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); //シフトキー戻す
としておりましたが、XPではカーソルが移動するだけで、範囲を選択できません。
拡張キーのときは、第3引数に[KEYEVENTF_EXTENDEDKEY]を指定しなければならない、というような内容を見つけたのですが「拡張キー」というものがいまいちわかりません。
Shiftキーのときは[KEYEVENTF_EXTENDEDKEY]を指定するとして、[A]や[1]などの時も[KEYEVENTF_EXTENDEDKEY]を指定してもいいのでしょうか?
ご存知の方がおりましたら、アドバイスをお願いいたします。
この程度であれば、試してみるとわかると思いますが、
# 「百聞は一見に如かず」
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
となります。
早速のご回答ありがとうございます。
ここで「VK_SHIFT」の時は、「KEYEVENTF_EXTENDKEY」を指定しないで、
「VK_RIGHT」の時だけ指定しているのはなぜなのでしょうか?
「SHIFT」は拡張キーではなく、「右キー」は拡張キーということですか?
もしそうであれば、何か拡張キーについて詳しいサイトなど教えていただけないでしょうか。
このての内容が詳しく書かれているサイトがいまいち見つかりません。
よろしくお願いいたします。
カーソルキー(矢印キー)や、PrintScreenなどのキーが拡張キーです。
検索してみると、IBM拡張キーボードに追加されたキーのようですね。
ちなみに、
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_RIGHT, 0, 0, 0);
keybd_event(VK_RIGHT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
を、「NUMLOCKをはずした状態で」動かしてみてください。
期待通りの動作をすると思います。
NUMLOCKがONの状態でShift+テンキーを押すと、HOME/ENDやPGUP/PGDOWN、カーソルキーの動作(NUMLOCKをオフのときの動作)になります。
実際に、どういう文字コードがきているか、メッセージを確認しながら行うと良いですよ。
キー入力部分をエミュレートする場合、思いもしないメッセージが飛んでることがありますから。
# 特に日本語入力
丁寧なご指導有難うございました。
とりあえずは、やりたいことはできました。
これからもっと細かいところまでチェックしながら進めていこうと思います。
ツイート | ![]() |