- ベストアンサー
VB6で他のアプリへ左右のCTRLキーを送る方法
- VB6でSendInputを使って左右のCTRLキーを送る方法を知りたい。
- VB6でSendInputを使用しているが、左右のCTRLキーの判別がうまくいかない。
- VB6のコードを実行すると、受け取る側のアプリで右のCTRLキーのみが受け取られ、左のCTRLキーは受け取られない。左右のCTRLキーを認識させる方法を知りたい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
以下の改造で動きます。 --- ■追加 Private Declare Function GetMessageExtraInfo Lib "user32" () As Long ■変更 Private Sub Send_LCtrl() Call KeyEvent(VK_LCONTROL, KEY_DOWN, 0) Call KeyEvent(VK_LCONTROL, KEY_UP, KEYEVENTF_KEYUP) End Sub Private Sub Send_RCtrl() Call KeyEvent(VK_RCONTROL, KEY_DOWN, KEYEVENTF_EXTENDEDKEY Or 0) Call KeyEvent(VK_RCONTROL, KEY_UP, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP) End Sub Sub KeyEvent(VkKey As Integer, UpDown As Integer, flags As Long) ' VkKey:仮想キーコード ' UpDown:動作(KEY_DOWN/KEY_UP) ' flags:フラグ Dim inputevents As INPUT_TYPE inputevents.dwType = INPUT_KEYBOARD With inputevents.xi .wVk = VkKey .wScan = MapVirtualKey(VkKey, 0) .dwFlags = flags .time = 100 .dwExtraInfo = GetMessageExtraInfo() End With Call SendInput(1, inputevents, Len(inputevents)) End Sub ---補足説明--- KEYEVENTF_EXTENDEDKEY の指定を間違えていたようです。 拡張キーは、歴史的に後から追加されたキーを指し、RShift, RAlt, RCtrl, End などが該当します。LCtrl は拡張キーではありません。 テンキー上の「/」は拡張キーなのに、テンキー上の「*」は拡張キーではない、などイレギュラーなものもあるようです。 GetMessageExtraInfo は MSDN の説明を元に一応設定しておきました。 ---参考サイト--- http://msdn.microsoft.com/ja-jp/library/ms646271(en-us,VS.85).aspx http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm
その他の回答 (2)
>を読み解かなければならないのでしょうが、基礎がないため内容が理解できません。 一番下に VB のソースが載っているのでそれをほとんど流用するだけですが。英語サイトだからといって尻込みしているだけに見えます。 ともあれ、後述の通りこのサイトのソースでも同じ現象が出るので、無意味となりました。 --- VB6 のコードを試してみましたが、再現しますね。 http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/ ↑ここに、VB2008 対応コードがダウンロードできる形で置かれていましたが、同じ症状でした。 また、上述したように以下のサイトのサンプルでも同じ症状でした(私は右Ctrlの送信しかテストしていませんでしたので、確認してみました)。 http://www.pinvoke.net/default.aspx/user32.SendInput なんか SendInput API の使い方を間違えているのでしょうかねぇ。 こんなサイトを見つけたので、 http://lukewarm.s101.xrea.com/index.html 興味本位でソースを覗いてみようと思いますが(ホットキーの割り当てだけでなくSendInputの機能もあり、左右のCtrlの送信が可能っぽい)、時間かかるかもです。 とりあえず、左Ctrl の送信は SendKey コマンドを使って回避してはどうでしょうか。
補足
英語が問題ということではありませんが Excel VBAしか経験なく、Classなどの概念が理解できていないことが一番問題です。今回、本を読みコトからはじめ、概念は理解できたつもりですが、コードがVBではない書式(Type→Structureなど)でVB.netはVB6と違うのか等苦戦してます。 dot.net 2003でも勉強しようかと購入し、封も開けず数年置いておいたものを、インストールしたところです。 >とりあえず、左Ctrl の送信は SendKey コマンドを使って回避してはどうでしょうか。 SendKeysではCtrl単体を送ることが出来ません。
こんにちは。少し確認点を。 1.wScan の値は左右で違う値に変換されていますか? 以前私が紹介した英語のサイト、ほぼそのまま入力してこちらでは動きました。VB6での掲載ソースとの違いを言うと、wScan = 0 固定でした。つまり MapVirtualKey は利用していません。 2.また送信対象のプログラムは信用できますか? 一応 VB6 で、右Ctrlと左Ctrlのキー入力を検知するソースを載せておきますので、これを使って実際にあなたが作成したプログラムから左右のCtrlが正しくキー送信されているか確認してみてください。 --- Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim k(255) As Byte If Shift = 2 Then GetKeyboardState k(0) If CBool(k(&HA2) And &H80) Then Me.Label1.Caption = "Left Ctrl Key" Else If CBool(k(&HA3) And &H80) Then Me.Label1.Caption = "Right Ctrl Key" End If End If Else Me.Label1.Caption = "" End If End Sub Private Sub Form_Load() Me.KeyPreview = True End Sub #フォームにラベルを一つ貼り、ますば手操作で検知できる事を確認して使ってください。
お礼
edp3142さん ご提供頂いたコードで試して見ました。 当方で作成したコードからは、左キーを送ったつもりでも右キーが受信されました。 提供頂いたコードは大変役に立ち、問題点が絞れてきました。 http://www.pinvoke.net/default.aspx/user32.SendInput を読み解かなければならないのでしょうが、基礎がないため内容が理解できません。
補足
edp3142さん ご親切に評価用コードを提供頂きありがとうございます。 3連休中に試してみます。 現在分りましたことは以下です。 それにしても、左キーではなく、右キーを入れたときと同じ動作となるのも変です。 > 1.wScan の値は左右で違う値に変換されていますか? VkKey=VK_LCONTROL、VkKey=VK_RCONTROLのいづれでも &H1Dです。 wScan = 0 に固定しても結果は同じでした。(右キーのシュミレートとなる) > 2.また送信対象のプログラムは信用できますか? 長年使用しているもので、大手の製品です。 左コントロールは入力エラーなどが発生たときの回復に使用するようになっています。手でキーを操作すると問題なく動作します。
お礼
完全なる解決です。 数度に亘りご指導感謝いたします。 蛇足ですが、いろいろ試してみて、仮想キーの値には関係なく、キーダウン時のFlagだけで左右が決まってしまうことがわかりました。