none
【VB2010】想不透了~ 上來問一下~ OverFlowException (FindWindow) RRS feed

  • 問題

  • 已經弄到可以跑出form但是又出現了我討厭的~OverFlowException

    希望有神人大大 , 可以為我解惑~ >"<

    程式碼片段如下

            ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)

            Dim lngPid As Integer

            If ParenthWnd.Equals(IntPtr.Zero) Then

                MessageBox.Show("Notepad Not Running!")

            Else

                GetWindowThreadProcessId(ParenthWnd, lngPid)

                MessageBox.Show(lngPid.ToString)

            End If

    出現 OverFlowException 的 是 lpszParentWindow

    2010年11月16日 上午 07:31

解答

    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:31
    2010年11月16日 上午 09:31
    版主
  • 在 .Net 原則上用 dllimport 宣告,且不要使用 "FindWindowA" ,A 字尾的是給 Win9x 相容用的,用 dllimport 可以選擇自動選用 "FindWindowA" 或 "FindWindowW" ,W 字尾的是給 WinNT 用的 (WinNT/2k/XP/2003/Vista/2008/7)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:31
    2010年11月16日 下午 02:28
  • 各位大哥好 經過不斷的爬文跟Google

    已經東湊西湊出來了 程式範例如下,可以隱藏跟顯示視窗

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
      Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As IntPtr) As Long
    
      Public Const SW_HIDE = 0
      Public Const SW_SHOW = 5
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button1.Visible = False
        Button2.Visible = True
      End Sub
    
      Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim hwd1 As IntPtr
        Dim wname As String = TextBox1.Text
        hwd1 = FindWindow(vbNullString, wname)
    
        If wname = "" Then
          Label1.Text = "尚未輸入"
        Else
          If hwd1.Equals(IntPtr.Zero) Then
            Label1.Text = "該程式未運行"
          Else
            Label1.Text = "該程式已運行"
          End If
        End If

    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:38
    2010年11月17日 上午 06:33

所有回覆

  • Hi!

    1. 你的 lpszParentWindow 是什麼? 相關宣告在哪邊?

    2. 參考 FindWindow (user32) http://www.pinvoke.net/default.aspx/user32.FindWindow

    getwindowthreadprocessid (user32) http://www.pinvoke.net/default.aspx/user32.getwindowthreadprocessid

    '// VB (chellios at gmail dot com)
    '// Open up a blank Notepad!
    Dim lpszParentClass As String = "Notepad"
    Dim lpszParentWindow As String = "Untitled - Notepad"
    Dim lpszClass As String = "Edit"
    
    Dim ParenthWnd As New IntPtr(0)
    Dim hWnd As New IntPtr(0)
    
    ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)
    
    If ParenthWnd.Equals(IntPtr.Zero) Then
      Debug.WriteLine("Notepad Not Running!")
    Else
      hWnd = FindWindowEx(ParenthWnd, hWnd, lpszClass, "")
    
      If hWnd.Equals(IntPtr.Zero)
        Debug.WriteLine("Notepad doesn't have an Edit component, how strange.")
      Else
        Debug.WriteLine("Notepad Window: " & ParenthWnd.ToString())
        Debug.WriteLine("Edit Control: " & hWnd.ToString())
      End If
    End If
    

    歡迎參觀我的Blog.NET菜鳥自救會
    2010年11月16日 上午 07:44
    版主
  • 小歐您好

    我就是照上面的方式去宣告

    另外在專案加個模組

    宣告很多 我就貼針對Findwindow的片段 你貼的方法我再試試看 謝謝回復

     

    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _

          (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    不過我這個問題是針對 【OverFlowException】 ^^|||

        Dim lpszParentClass As String = "Notepad"
        Dim lpszParentWindow As String = "123 - 記事本"
    
        Dim ParenthWnd As New IntPtr(0)
        Dim hWnd As New IntPtr(0)
    
        ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)
    
        Dim lngPid As Integer
    
        If ParenthWnd.Equals(IntPtr.Zero) Then
          MessageBox.Show("Notepad Not Running!")
        Else
          GetWindowThreadProcessId(ParenthWnd, lngPid)
          MessageBox.Show(lngPid.ToString)
        End If

    2010年11月16日 上午 07:54
  • 小歐 你的網站很適合我耶

    我正在拜讀中~^^

    2010年11月16日 上午 08:16
    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:31
    2010年11月16日 上午 09:31
    版主
  • 在 .Net 原則上用 dllimport 宣告,且不要使用 "FindWindowA" ,A 字尾的是給 Win9x 相容用的,用 dllimport 可以選擇自動選用 "FindWindowA" 或 "FindWindowW" ,W 字尾的是給 WinNT 用的 (WinNT/2k/XP/2003/Vista/2008/7)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:31
    2010年11月16日 下午 02:28
  • 在 .Net 原則上用 dllimport 宣告,且不要使用 "FindWindowA" ,A 字尾的是給 Win9x 相容用的,用 dllimport 可以選擇自動選用 "FindWindowA" 或 "FindWindowW" ,W 字尾的是給 WinNT 用的 (WinNT/2k/XP/2003/Vista/2008/7)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    那麼 在vb.net的話 要怎麼import呢?
    2010年11月17日 上午 06:31
  • 各位大哥好 經過不斷的爬文跟Google

    已經東湊西湊出來了 程式範例如下,可以隱藏跟顯示視窗

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
      Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nCmdShow As IntPtr) As Long
    
      Public Const SW_HIDE = 0
      Public Const SW_SHOW = 5
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button1.Visible = False
        Button2.Visible = True
      End Sub
    
      Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim hwd1 As IntPtr
        Dim wname As String = TextBox1.Text
        hwd1 = FindWindow(vbNullString, wname)
    
        If wname = "" Then
          Label1.Text = "尚未輸入"
        Else
          If hwd1.Equals(IntPtr.Zero) Then
            Label1.Text = "該程式未運行"
          Else
            Label1.Text = "該程式已運行"
          End If
        End If

    • 已標示為解答 Rickyjim 2010年11月17日 上午 06:38
    2010年11月17日 上午 06:33
  • 	<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="FindWindowExW", CharSet:=Runtime.InteropServices.CharSet.Auto, ExactSpelling:=True, CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall)> _
    	Private Function FindWindowEx( _
    	 ByVal hwndParent As IntPtr, _
    	 ByVal hwndChildAfter As IntPtr, _
    	 ByVal lpClassName As String, _
    	 ByVal lpWindowName As String) As IntPtr
    	End Function
    
    	<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="FindWindowW", CharSet:=Runtime.InteropServices.CharSet.Auto, ExactSpelling:=True, CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall)> _
    	Private Function FindWindow( _
    	 ByVal lpClassName As String, _
    	 ByVal lpWindowName As String) As IntPtr
    	End Function
    
    	<Runtime.InteropServices.DllImport("user32.dll")> _
    	Public Function ShowWindow( _
    	 ByVal hWnd As IntPtr, _
    	 ByVal nCmdShow As ShowWindowCommands _
    	 ) As Integer
    	End Function
    
    

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月18日 下午 02:54