none
請問在Visual basic 2005 如何去接受Windows訊息? RRS feed

  • 問題

  • 在VB6中使用Hook與Sned Message去接收WINDOWS訊息是可以的,但在升級成Visual basic 2005 卻發生問題?

    在VB6中,程式的內容如 http://search.support.microsoft.com/kb/170570

    但在升級成Visual basic 2005 時,在Hook函式中的AddressOf卻出現錯誤訊息。

    請問要如何解決這個問題?

    還有其他方式可以接受Windows訊息嗎?

        Public Sub Hook()
            lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
                                         AddressOf WindowProc)
        End Sub

    2006年11月30日 上午 01:54

解答

  • VB.NET 的話需要用  Delegate 來實作 callback, 因為 AddressOf 傳回的會是 Delegate。

    不過若你只是單純要接收 Windows 訊息的話其實只要 Override 任何 Control 的 WndProc 就好了, 非常簡單:

        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            MyBase.WndProc(m)

            'TODO: 加入處理訊息的程式碼

        End Sub

    2006年11月30日 下午 06:58

所有回覆

  • VB.NET 的話需要用  Delegate 來實作 callback, 因為 AddressOf 傳回的會是 Delegate。

    不過若你只是單純要接收 Windows 訊息的話其實只要 Override 任何 Control 的 WndProc 就好了, 非常簡單:

        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            MyBase.WndProc(m)

            'TODO: 加入處理訊息的程式碼

        End Sub

    2006年11月30日 下午 06:58
  • 謝謝你的回覆!

    目前我遇到的狀況為:

    在HOOK Function中,若使用Delegate來實作其宣告是沒有問題的。

    但在UNHOOK Function中,lpPrevWndProc參數卻因為型別的問題,而有問題。

    想了解的是要如何解決參數型別的問題?

       Public Sub UnHook()
            Dim lngReturnValue As Long
            lngReturnValue = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
        End Sub

    2006年12月1日 上午 12:49
  • 你可以用 System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate() 跟 System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer() 來將 Delegate 跟 function pointer 做轉換的動作。
    2006年12月1日 上午 02:22
  • 謝謝你的回覆!

    給了我另一個方向,我會在試試看的。

     

    THKS!

     

    2006年12月1日 上午 04:33
  • 請問GetDelegateforFunctionPointer()與GetFunctionPointerforDelegate(),有相關的範例可供參考嗎?

    因為我網路上只搜尋到語法的宣告,卻找不到範例?

     

    謝謝!

    2006年12月4日 上午 02:55