- ベストアンサー
VB6.0 KeyDownイベントの対応
- VB6.0を使ってプログラム中ですが、キー「↓」のイベント KeyDownが受信されず、他のボタンにフォーカスが移ってしまいます。
- Command10_KeyDownで複合キー「Ctrl + ↓」のイベント KeyDownが受信できるようです。
- Comman10_GotFocusに対応策を記述して、キー「↓」のイベント KeyDownを受信する方法はないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
(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 以上です。
その他の回答 (4)
- piroin654
- ベストアンサー率75% (692/917)
Private Sub Form_Activate() Text1.SetFocus End Sub のText1は非表示でも構いません。
- piroin654
- ベストアンサー率75% (692/917)
No2の Form1のGeneral部分、つまり とは、Form1のコード表のことです。 プロジェクトで設定する標準モジュールでは ありません。プロジェクトで設定する 標準モジュールに設定する場合は、 Publicにします。
補足
当方の補足質問にご丁寧な解答を2回も頂き、誠にありがたく深く感謝申し上げます。 前回の補足質問は、実はそうではないかと推測して、ご指摘のように Private を Public に変更して、標準モジュールに追加挿入した上で、テストした結果の報告でした。 私の報告が言葉たらずで、ご迷惑をお掛けしてしまう結果になってしまい、申し訳ありません。お詫び申し上げます。 今更で申し訳ありませんが、「上手く動作しない」と報告いたしました点の詳細を報告いたします。 不具合点1)プログラム起動直後では Commnd10(TabIndex=1) にフォーカスがあるので、そのまま下↓キーを押すと、Command10(TabIndex=1) の 下↓キー対応処理が起動 が起動しないで、フォーカスが次のコマンドボタンCommand20(TabIndex=2)に移った上で Command20 の 下↓キー対応処理が起動してしまう。 不具合点2)Command10 にフォーカスを移して下↓キーを押すと、Command10 の の下↓キー対応処理が上手くできましたが、残念ながらその処理後、内部からCommand10 にフォーカスをもどしますと、下↓キーを押してもいないのに、再び下↓対応処理が始まってしまいます。 尚、ご提案の方法しかなそそうですので今回で終わりにしたいと思っております。これまでのご協力に感謝申し上げます。本当にありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
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です。
- piroin654
- ベストアンサー率75% (692/917)
フォームに 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 の何処に挿入すればいいのでしょうか?
お礼
ご丁寧な回答をありがとうございました。 突然の不幸で時間がとれず、テストとお礼が遅れてしまいました。 お詫びもうしあげます。 早速テストしまして、希望通りに動作することを確認いたしましたので、採用させていただきます。 本当にありがとうございました。