2010-08-17 60 views
0

我在VB6項目的工作,我需要有鍵盤快捷鍵的工具欄上的控制按鈕一起崩潰的應用程序。爲了做到這一點,我使用了vbAccelerator的Win32 Hooks庫。這是我的IWindowsHook_HookProc功能,我使用檢索擊鍵&基於按下快捷執行動作(新建Ctrl + N,按Ctrl + O用於打開和Ctrl + S進行保存),但我不知道什麼是錯的代碼與VB6 IDE一起崩潰了我的應用程序。該功能目前不完整,因爲我試圖識別「Ctrl + N」組合鍵來測試此功能。請幫我解決....: - |使用vbAccelarator Win32的掛鉤與VB IDE

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 

回答

0

我已經找到了解決我自己的問題,它仍然崩潰傾向如果不小心處理,但現在我的應用程序實際上響應我想要的按鍵組合,Ctrl + N,Ctrl + 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 
1

我對此掛鉤庫中沒有經驗,但我的猜測是,你應該做的HookProc過程本身很少。您直接從Windows API調用,而不是通過VB6運行時。我並不感到驚訝的是,按照您的描述,顯示錶單會使所有內容崩潰。有沒有關於vbAccelerator網站上關於在HookProc中放置什麼樣的代碼的建議?順便說一句,vbAccelerator是一個很棒的網站。

我建議你只需設置一個標誌變量的地方,以表明frmNewReport應該顯示。您應該有一個Timer以較短的時間間隔(例如100毫秒)運行,該時間間隔檢查標記變量:如果設置了標記,則清除標記並顯示錶單。

+0

感謝您的回覆,我已經下載了vbAccerator的完整源代碼,演示瞭如何使用Keyboard Hooks,在該項目中,鉤子通過標準控件進行演示。例如;在窗體上給出一個文本框,作爲一種常規行爲,在聚焦控件後按下一個標籤將把焦點轉移到下一個控件,但在Hook的幫助下,當按下Tab時,文本框的文本像任何文字處理器一樣被選中。我使用了類似的邏輯,但使用了工具欄控件,而且由於我的主MDI表單不需要菜單欄,我只需要爲工具欄按鈕設置快捷方式。 – Kushal 2010-08-18 08:23:03

2

使用的IDE掛鉤會導致很多死機,赫克使用鉤沒有完全瞭解你在做什麼會導致大量的崩潰時期......

馬克是關於正確定時器與展示形式,因爲鉤子功能應該儘快返回(< 50毫秒),否則您的遺囑將非常迅速地以死鎖(和崩潰的應用程序)結束。切勿在Hook過程中設置斷點,否則將終止您的IDE(可能會崩潰,可能是掛起,也可能是某種奇怪的狀態,您永遠無法離開斷點並且無法停止調試)。如果您想要基於按鍵運行大量長時間運行的函數,請設置一系列要在計時器中執行的操作。使用掛鉤庫非常強大,但與大國意味着巨大的崩潰......

+0

我將用計時器定期調用HOOKPROC方法,但目前我的代碼(HOOKPROC方法,在我的問題所示)是無法識別的所有鍵事件,而我不明白如何讓鍵盤快捷鍵的工具欄控制(這隻需使用Hooks以更實用的方式控制我想要的主MDI From)按鈕。 – Kushal 2010-08-18 08:33:00