0

ツールバー コントロールのボタンのキーボード ショートカットが必要な VB6 プロジェクトに取り組んでいます。これを実現するために、 vbAccelerator のWin32 Hooks ライブラリを使用しました。これは、IWindowsHook_HookProcキーストロークを取得し、押されたショートカットに基づいてアクションを実行するために使用する関数です ( Ctrl+Nは新規、Ctrl+O は開く、Ctrl+Sは保存) が、アプリケーションをクラッシュさせるコードの何が問題なのかわかりませんVB6 IDE とともに。Ctrlこの機能をテストするために+Nキーの組み合わせを特定しようとしたため、機能は現在不完全です。私を助けてください.... :-|

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long
If KeyboardlParam(lParam).KeyDown Then
     Select Case True
           Case Me.ActiveControl = Me
                 If wParam = vbKeyControl + vbKeyN Then
                        frmNewReport.show
                        bConsume = True
                 End If
     End Select
End If
4

3 に答える 3

2

IDE でフックを使用すると、多くのクラッシュが発生する可能性があります。何をしているのかを完全に理解せずにフックを使用すると、多くのクラッシュ期間が発生します...

フック関数はできるだけ早く (< 50 ミリ秒) 戻る必要があるため、マークは show フォームのタイマーについて正しいです。フック プロシージャ内にブレークポイントを設定しないでください。そうしないと、IDE が強制終了されます (ブレークポイントを離れられず、デバッグを停止できない場合、クラッシュ、ハング、奇妙な状態になる可能性があります)。キープレスに基づいて実行したい実行時間の長い関数が大量にある場合は、タイマーで実行するアクションのスタックを設定します。フック ライブラリの使用は非常に強力ですが、強力な機能を使用すると、大きなクラッシュが発生します...

于 2010-08-17T18:06:02.097 に答える
1

私はそのフック ライブラリの経験はありませんが、HookProcプロシージャ自体で行うことはほとんどないはずです。VB6 ランタイム経由ではなく、Windows API から直接呼び出されています。あなたが説明したように、フォームを表示するとすべてがクラッシュすることに驚かない. vbAccelerator サイトで、どのようなコードを入れるかについて何かアドバイスはありましたHookProcか? ちなみに、vbAccelerator は優れたサイトです。

frmNewReport を表示する必要があることを示すフラグ変数をどこかに設定することをお勧めします。Timerフラグ変数をチェックする短いティック間隔、たとえば 100 ミリ秒で実行する必要があります。フラグが設定されている場合は、フラグをクリアしてフォームを表示します。

于 2010-08-17T15:47:09.667 に答える
0

私は自分の質問に対する解決策を見つけました。注意深く処理しないとクラッシュしやすいのですが、アプリケーションは実際に必要なキーの組み合わせCtrl+ NCtrl+Oなどに応答します。以下は、これまでのところ正常に機能する修正されたコードです。私の知る限り。アプリケーションのクラッシュにつながるバグを見つけたら、提案してください。

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Property Get CtrlPressed() As Boolean
   CtrlPressed = (GetAsyncKeyState(vbKeyControl) <> 0)
End Property

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long

If wParam = vbKeyN Then
    If CtrlPressed Then
        LoadFormNewReport 'Method that opens Child Form 'New Report'
    End If
    bConsume = True

ElseIf wParam = vbKeyS Then
    If CtrlPressed Then
        SaveNewReport 'Method that saves new Report
    End If
    bConsume = True

ElseIf wParam = vbKeyF5 Then
    If Not CtrlPressed Then
        frmSettings.Show 'This form needs to be displayed Modally but if tried so then crashes application along with VB  IDE, other short-cuts work fine.
        bConsume = True
    End If

End If

End Function
于 2010-08-18T09:33:07.313 に答える