tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルkeybd_eventの使い方、定数は何?
記事No12360
投稿日: 2008/05/26(Mon) 09:34
投稿者おじん
いつもお世話になっています。

今回は、ここ花ちゃんのサンプルを参考に「」を使って文字を入力
するテストをしていますが、キーボードの文字で「括弧"()"、ベキ
記号"^"」の入力方法がわかりません。

keybd_event関数の第一引数bVKの値はどのようにしたらよいのでし
ょうか。vBK定数の値を見ていったときASCII値かと思ったのですが
必ずしもそうなっていません。

因みに"("は40で、これを与えると"8"になります。これはvbKey8と
同じです。キーボードを眺めて、"("はShift+"8"なので、下記の
Command3_Clickのようにして試したのですが"8"のままです。

何か特殊なやり方がありそうです。
教えてください。よろしくお願いいたします。

以下は、テストコードです:
'----------------------------------------------------------
'keybd_event=>キーの状態を設定する    
'----------------------------------------------------------
'<引数>
'bVk:        定数(VK_XXXXX参照)またはVBの定数
'bScan:       スキャンコード
'dwFlags:     定数 (KEYEVENTF_参照)
'dwExtraInfo: 常に0

Private Declare Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP = &H2   ' キーを放す
Private Const VK_RETURN = &HD         '「Enter」キー
Private Const VK_SHIFT = &H10          '「Shift」キー

Private Const VK_ADD = &H6B            '「+」キー
Private Const VK_MINUS = &H6D          '  −
Private Const VK_A = 65                '「A」キー
Private Const VK_B = 66                '「B」キー

'Key0 〜 Key9 は ASCII コードの "0" 〜 "9" と同じ
'vbKey0 vbKey1 vbKey2 vbKey3 vbKey4
'vbKey5 vbKey6 vbKey7 vbKey8 vbKey9

private VK_Key as Byte    'テスト用文字

'ここ花ちゃんのサンプル
Private Sub Command1_Click()
    Call keybd_event(VK_A, 0, 0, 0)
    Call keybd_event(VK_A, 0, KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_RETURN, 0, 0, 0)
    Call keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
End Sub

'これはテスト用
Private Sub Command2_Click()
'文字を押す
    Text1.SetFocus
    VK_Key=vbKey8
    Call keybd_event(VK_Key, 0, 0, 0)
    Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_Key, 0, KEYEVENTF_KEYUP, 0)

    Call keybd_event(VK_RETURN, 0, 0, 0)
    Call keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
    Text1.SetFocus
End Sub

Private Sub Command3_Click()
'SHIFT+文字を押す
    Text1.SetFocus
    VK_Key=vbKey8
    Call keybd_event(VK_SHIFT, 0, 0, 0)
    Call keybd_event(VK_Key, 0, 0, 0)
    Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_Key, 0, KEYEVENTF_KEYUP, 0)

    Call keybd_event(VK_RETURN, 0, 0, 0)
    Call keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
    Text1.SetFocus
End Sub

[ツリー表示へ]
タイトルRe:解決しました。
記事No12361
投稿日: 2008/05/26(Mon) 10:21
投稿者おじん
投稿では、VB_Key8 としているところをテストでは VK_NUMPAD8 を
使用していました。
ご迷惑をおかけしました。

> Private Sub Command3_Click()
> 'SHIFT+文字を押す
>     Text1.SetFocus
>     VK_Key=vbKey8   <<<<<<<<ここの所をミスしていた。
>     Call keybd_event(VK_SHIFT, 0, 0, 0)
>     Call keybd_event(VK_Key, 0, 0, 0)
>     Call keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)

[ツリー表示へ]
タイトルRe^2:解決しました。
記事No12362
投稿日: 2008/05/26(Mon) 10:30
投稿者花ちゃん
因みに ^  のキーコード定数は、 &HDE  10進で 222 です。

[ツリー表示へ]
タイトルRe^3:ありがとうございます。
記事No12369
投稿日: 2008/05/26(Mon) 14:54
投稿者おじん
> 因みに ^  のキーコード定数は、 &HDE  10進で 222 です。
解決しました、としながらも、^(ハット、ベキ記号)はうまく
いっていませんでした。
ASCIIコード表を見ながらテストをし、その通りにならない文字が
幾つかあることを知りました、が、ではどうすればよいか。
朝からネットめぐりをし、再びここに来て、本当の解決が得られま
した。ありがとうございます。
当面は不要(使わない)ですが、ASCII 91->96 も旨くいきません。
ASCII 32から+1しながらプログラムでテストしていたら、色々な
ことが起こり、無茶なことはしてはいけないと反省しています。
また、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^4:ありがとうございます。
記事No12376
投稿日: 2008/05/26(Mon) 16:21
投稿者花ちゃん
> 当面は不要(使わない)ですが、ASCII 91->96 も旨くいきません。

[ = 219
\ = 220
] = 221
^ = 222

下記で調べて見て下さい。
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
   Debug.Print KeyCode
End Sub

[ツリー表示へ]
タイトルRe^5:重ね重ね、ありがとうございます。
記事No12385
投稿日: 2008/05/27(Tue) 04:16
投稿者おじん
> 下記で調べて見て下さい。
> Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
>    Debug.Print KeyCode
> End Sub
幾つかの思い込み、早とちり、VK_定数をチラッと見て、ASCIIコードと同じ
なんだと。また、違ったものを見て、_KeyPress(Ascii As Integer,  )で
調べて、迷路に入ったようです。習慣的に_KeyDownはあまり使用しません。

30年前のAsciiコードを見ながら、この時にすでにあった幾つかの特殊文字
(^\[]など)を256文字扱えるようになったとき+128した位置に配置した訳は
何でしょうか。同じままであったなら混乱は無いはずなのに。
Microsoftはこれだけではありませんが。

重ね重ね、丁寧なご返事、ありがとうございます。

[ツリー表示へ]