none
請問用sendmessage判斷錯誤訊息的問題? RRS feed

  • 問題

  • 目前想利用sendmessage來做監控程式,2個程式(程式端、監控端)間已經利用sendmessage溝通沒問題。

    目前測試是由【程式端】利用timer持續發送訊息給【監控端】,如果【程式端】發生錯誤訊息理論應該【監控端】不會再接收到資料,但是實際測試後發現程式端彈出錯誤後【監控端】還是會一直收到訊息,並不會停止!請問有何方法還是觀念有誤?

    *******程式端**********

    <StructLayout(LayoutKind.Sequential)> _ Public Structure CopyDataStruct Public dwData As Integer '附加參數 Public cbData As Integer '數據大小 Public lpData As IntPtr '數據內容 End Structure <DllImport("user32.dll", EntryPoint:="SendMessage")> _ Public Shared Function SendMessage(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer End Function Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try Dim S = "t2" If S.Length <= 0 Then Exit Sub End If Dim vProcesses As Process() = Process.GetProcessesByName(S) If vProcesses.Length <= 0 Then Exit Sub End If Dim vCopyDataStruct As New CopyDataStruct() vCopyDataStruct.dwData = 0 vCopyDataStruct.cbData = S.Length * Len(New Char) + Len(New Char) '最後結束符號 \x00 vCopyDataStruct.lpData = Marshal.StringToBSTR(S) Dim vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vCopyDataStruct)) Marshal.StructureToPtr(vCopyDataStruct, vAddress, True) For Each vProcess As Process In vProcesses Try SendMessage(vProcess.MainWindowHandle, WM_COPYDATA, 0, vAddress.ToInt32) Catch ex As Exception MsgBox(ex.Message.ToString) End Try Next Marshal.FreeBSTR(vCopyDataStruct.lpData) Marshal.FreeCoTaskMem(vAddress) Catch ex As Exception MsgBox(ex.Message.ToString) End Try End Sub '製造錯誤 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click MsgBox(CInt("ABCDEF")) End Sub

    *********監控端****************

    <StructLayout(LayoutKind.Sequential)> _ Public Structure CopyDataStruct Public dwData As Integer '附加參數 Public cbData As Integer '數據大小 Public lpData As IntPtr '數據內容 End Structure Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case WM_COPYDATA Dim vCopyDataStruct As CopyDataStruct = CType(Marshal.PtrToStructure(m.LParam, GetType(CopyDataStruct)), CopyDataStruct) Me.TextBox1.Text = Marshal.PtrToStringBSTR(vCopyDataStruct.lpData) Exit Select End Select MyBase.WndProc(m) End Sub


    2012年5月30日 上午 08:34

解答

  • 表示您的[程式端]雖然執行發生錯誤, 但是並未因為發生錯誤而停止執行, 所以繼續定時發送訊息到[監控端], 您可以在Catch段落中呼叫Timer的Stop方法, 將計時器停止就不會再發送訊息了:

    Catch ex As Exception

                Timer1.Stop()
               
    MsgBox(ex.Message.ToString)
    End Try

    2012年5月30日 下午 01:38

所有回覆

  • 目前想利用sendmessage來做監控程式,2個程式(程式端、監控端)間已經利用sendmessage溝通沒問題。

    目前測試是由【程式端】利用timer持續發送訊息給【監控端】,如果【程式端】發生錯誤訊息理論應該【監控端】不會再接收到資料,但是實際測試後發現程式端彈出錯誤後【監控端】還是會一直收到訊息,並不會停止!請問有何方法還是觀念有誤?


    你說 "【程式端】發生錯誤訊息 ",是什麼樣的信息?是不是一個MsgBox?

    如果是的話,恭喜你,那代表你的 Try...Catch...End Try 已成功保護了你的【程式端】停止運作,所以它還在跑。

    如果你直接關掉它和它已跳進嚴重錯誤或沒 Try..Catch...End try保護的錯誤,而且關了程式後,還會在【監控端】收到信息才是要害怕呀。


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年5月30日 上午 09:07
  • 不好意思沒有Try也是一樣,用Try只是看可否看出甚麼錯誤
    2012年5月30日 上午 09:58
  • 表示您的[程式端]雖然執行發生錯誤, 但是並未因為發生錯誤而停止執行, 所以繼續定時發送訊息到[監控端], 您可以在Catch段落中呼叫Timer的Stop方法, 將計時器停止就不會再發送訊息了:

    Catch ex As Exception

                Timer1.Stop()
               
    MsgBox(ex.Message.ToString)
    End Try

    2012年5月30日 下午 01:38
  • Windows 是事件導向,所以跳出錯誤盒,可能只是某個執行緒發生問題,不代表整個程式就不回應,除非你那隻程式當錯誤訊息跳出時,原始程式的畫面會死掉變成無法正確看到,那種才不會回應 Window Message 。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年5月30日 下午 03:01
  • 謝謝各位大大我還是想不通為何?還是有其他想法或方式呢?
    2012年6月1日 上午 05:21
  • 你用 spy++ 去觀察後再說吧~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月1日 下午 04:27
  • 是否有方法做到不用try遇到錯誤停止timer,

    本身想法是想寫一個DLL讓任何常駐程式使用,並希望能透過溝通方式確認程式是否還在執行或有其他訊息!

    所以會以不修改程式本體為主要方向。

    Spy++有試過,但要蒐集程式任何有可能彈出的視窗類別!

    2012年6月25日 上午 06:09
  • 用 Spy++ 去觀察的目的是確認系統有發出 Window Message ,但可以發現應用程式根本不屌他。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月25日 下午 03:12