プロが教える店舗&オフィスのセキュリティ対策術

VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。
Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか?

Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 40 Then
execsub001()
End If
End Sub

Private Sub Commnad10_Click()
execsub001()
End Sub

Private Sub Comman10_GotFocus()
上記問題への対応策を此処に記述したい
End If

Private Sub execsub110()
内容は省略
End Sub

A 回答 (5件)

フォームに




Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const VK_DOWN = &H28 '↓です


Private Sub Command10_GotFocus()
If GetAsyncKeyState(VK_DOWN) Then
MsgBox "確認"
End If
End Sub

この回答への補足

早速のご回答ありがとうございました。
ご指摘の文を Form の標準モジュールに追加して試してみましたが、上手く動作できませんでした。
Form の何処に挿入すればいいのでしょうか?

補足日時:2011/04/21 18:23
    • good
    • 0

Form1のGeneral部分、つまり



Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const VK_DOWN = &H28

のようにします。標準モジュールに設定するときは、

Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_DOWN = &H28

のようにPrivate をPublicにします。
あえてForm1だけの機能としてForm1のGeneralに宣言しています。

なお、 GetAsyncKeyState関数はWindowsのAPIです。
    • good
    • 0

No2の



Form1のGeneral部分、つまり

とは、Form1のコード表のことです。
プロジェクトで設定する標準モジュールでは
ありません。プロジェクトで設定する
標準モジュールに設定する場合は、
Publicにします。

この回答への補足

当方の補足質問にご丁寧な解答を2回も頂き、誠にありがたく深く感謝申し上げます。
前回の補足質問は、実はそうではないかと推測して、ご指摘のように Private を Public に変更して、標準モジュールに追加挿入した上で、テストした結果の報告でした。
私の報告が言葉たらずで、ご迷惑をお掛けしてしまう結果になってしまい、申し訳ありません。お詫び申し上げます。
今更で申し訳ありませんが、「上手く動作しない」と報告いたしました点の詳細を報告いたします。
不具合点1)プログラム起動直後では Commnd10(TabIndex=1) にフォーカスがあるので、そのまま下↓キーを押すと、Command10(TabIndex=1) の 下↓キー対応処理が起動 が起動しないで、フォーカスが次のコマンドボタンCommand20(TabIndex=2)に移った上で Command20 の 下↓キー対応処理が起動してしまう。
不具合点2)Command10 にフォーカスを移して下↓キーを押すと、Command10 の の下↓キー対応処理が上手くできましたが、残念ながらその処理後、内部からCommand10 にフォーカスをもどしますと、下↓キーを押してもいないのに、再び下↓対応処理が始まってしまいます。
尚、ご提案の方法しかなそそうですので今回で終わりにしたいと思っております。これまでのご協力に感謝申し上げます。本当にありがとうございました。

補足日時:2011/04/22 15:07
    • good
    • 0

(1)



>不具合点1)プログラム起動直後では Commnd10(TabIndex=1)
>にフォーカスがあるので、そのまま下↓キーを押すと、
>Command10(TabIndex=1) の 下↓キー対応処理が起動 が起動
>しないで、フォーカスが次のコマンドボタンCommand20(TabIndex=2)
>に移った上で Command20 の 下↓キー対応処理が起動してしまう。

Timerイベントまたは、

Private Sub Form_Activate()
Text1.SetFocus
End Sub

で起動時のフォーカスを特定のコントロールに設定する。



(2)

>不具合点2)Command10 にフォーカスを移して下↓キーを押すと、
>Command10 の の下↓キー対応処理が上手くできましたが、
>残念ながらその処理後、内部からCommand10 にフォーカスを
>もどしますと、下↓キーを押してもいないのに、再び下↓対応
>処理が始まってしまいます。

この部分の設定はよくわかりませんが、
以下のような設定では、

>もどしますと、下↓キーを押してもいないのに、再び下↓対応
>処理が始まってしまいます。

はおこりませんが。


Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const VK_DOWN = &H28

Private Sub execsub001()
MsgBox "やあ"
Me.Command1.SetFocus
End Sub

Private Sub Command1_GotFocus()
'If GetKeyState(VK_DOWN) Then
If GetAsyncKeyState(VK_DOWN) Then
MsgBox "確認"
execsub001
End If
End Sub

Private Sub Form_Activate()
Text1.SetFocus
End Sub


以上です。
    • good
    • 0
この回答へのお礼

ご丁寧な回答をありがとうございました。 突然の不幸で時間がとれず、テストとお礼が遅れてしまいました。 お詫びもうしあげます。
早速テストしまして、希望通りに動作することを確認いたしましたので、採用させていただきます。 本当にありがとうございました。

お礼日時:2011/04/27 09:57

Private Sub Form_Activate()


Text1.SetFocus
End Sub

のText1は非表示でも構いません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!