VB6で他のアプリへ左右のCTRLキーを送る方法
先に「Excel VBA で CTRLキーを送る方法」と題して質問したものです。
VB6でSendInputを使うアドバイスを頂きCTRLを送ることが出来たので解決したと思っていましたが、左右のキーの判断が出来ていないようです。
下記のコードを実行形式にしてたとき、引数の如何にかかわらず、受け取る側(YourAppli.ws)では右のCTRLを受け取った動作をします。左のCTRL(Zキーに近い方)を受け取った動作をしてくれません。
アプリケーションに左右のCTRLを認識させる方法をご教示お願いします。
コードの作成は http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/を参考に致しました。
Option Explicit
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
no_use1 As Long
no_use2 As Long
End Type
Private Type INPUT_TYPE
dwType As Long
xi As KEYBDINPUT
End Type
'仮想キーコード
Private Const KEYEVENTF_KEYUP = &H2 'キーアップ
Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード
Private Const INPUT_KEYBOARD = 1 '入力タイプ:キーボード
Private Const VK_CTRL = &H11 'Contorol
Private Const VK_LCONTROL = &HA2 'Left_Contorol
Private Const VK_RCONTROL = &HA3 'Right_Contorol
Private Const VK_RETURN = &HD 'Right_Contorol
Private Const KEY_DOWN = 0 'キー押し下げ
Private Const KEY_UP = 1 'キーアップ
'仮想キーコード・ASCII値・スキャンコード間でコードを変換する
Private Declare Function MapVirtualKey Lib "user32" _
Alias "MapVirtualKeyA" (ByVal wCode As Long, _
ByVal wMapType As Long) As Long
'キーストローク、マウスの動作、ボタンのクリックをシミュレートする
Private Declare Function SendInput Lib "user32.dll" _
(ByVal nInputs As Long, pInputs As INPUT_TYPE, _
ByVal cbsize As Long) As Long
' 指定時間Wait(ミリ秒)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Main()
Const AppID = "YourAppli.ws"
Dim i As Integer
AppActivate AppID
Select Case Command
Case "L", "l"
Send_LCtrl
Case "R", "r"
Send_RCtrl
Case ""
Send_Ctrl
Case Else
MsgBox ("Error")
End Select
Sleep 50
End Sub
Private Sub Send_LCtrl()
Call KeyEvent(VK_LCONTROL, KEY_DOWN)
Call KeyEvent(VK_LCONTROL, KEY_UP)
End Sub
Private Sub Send_RCtrl()
Call KeyEvent(VK_RCONTROL, KEY_DOWN)
Call KeyEvent(VK_RCONTROL, KEY_UP)
End Sub
Private Sub Send_Ctrl()
Call KeyEvent(VK_CTRL, KEY_DOWN)
Call KeyEvent(VK_CTRL, KEY_UP)
End Sub
Sub KeyEvent(VkKey As Integer, UpDown As Integer)
' VkKey:仮想キーコード
' UpDown:動作(KEY_DOWN/KEY_UP)
'
Dim inputevents As INPUT_TYPE
With inputevents
.dwType = INPUT_KEYBOARD
With .xi
.wVk = VkKey '操作キーコード
.wScan = MapVirtualKey(VkKey, 0) 'スキャンコード
If UpDown = KEY_DOWN Then 'キーDown
.dwFlags = KEYEVENTF_EXTENDEDKEY Or 0
Else 'キーUP
.dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
End If
.time = 0
.dwExtraInfo = 0
End With
End With
Call SendInput(1, inputevents, Len(inputevents))
End Sub
お礼
edp3142さん ありがとうございました。解決しましたといいたいところですが、VBAしか経験なく、解決できません。次ののコードをVB6またはVB.netで記述すればどうなりますでしょうか。これを機会にVBを経験したいので教えてください。厚顔で恐縮です。 真奈 Sub SendKeyCode() const SessinonCode="MyCode" AppActivate SessionCode SendKeys "右のCtrl Key", true SendKeys "左のCtrl Key", true End Sub Key Boadは日本語106です。 これが出来れば、VBからVBAを呼び出して処理できそうなので。 DLLを作るなどとても手に負えません。
補足
解決することが出来ましたので、お礼まで。 http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/ に初心者にも分る例がありましたので理解できました。真奈