2011-04-12 14 views
1

我當前的代碼:「算術溢出錯誤」錯誤獲取表單處理程序(Vb.net)

Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function SendMessage(ByVal hWnd As HandleRef, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr 
End Function 

Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr 

Public Function WindowHandle(ByVal sTitle As String) As Long 
    WindowHandle = FindWindow(vbNullString, sTitle) 
End Function 

Dim CurrentProcess As Process 
Dim CurrentHandle As IntPtr 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    SendMessage(CurrentHandle, 256, Keys.A, 0) 
    SendMessage(CurrentHandle, 257, Keys.A, 65539) 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Try 
     CurrentProcess = Process.GetProcessesByName(ListBox1.SelectedItem.ToString.Remove(0, ListBox1.SelectedItem.ToString.IndexOf("{") + 1).Replace("}", ""))(0) 
     CurrentHandle = New IntPtr(WindowHandle(CurrentProcess.MainWindowTitle)) 
     Timer1.Start() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

如果你看一看按鈕子,每次運行時,它的誤差隨時間

這裏有什麼問題?這應該工作......對嗎?

對不起,這有些含糊,但它和我所知的一樣。

+0

什麼是在列表框中? – 2011-04-12 23:33:13

+0

分析過的東西(注意獲取進程的行)是進程的名稱。變量「CurrentProcess」找出。 – FreeSnow 2011-04-12 23:37:04

+1

你爲什麼要用'DllImport'混合'Declare'語句?它們幾乎是相同的風格,但最好選擇一個並堅持下去。 – 2011-04-13 05:42:38

回答

5

你的聲明聲明是正確的,但你稱他們的方式不是。 VB.NET允許的寬鬆打字讓你陷入困境,這是你無法診斷的。解決方法是讓編譯器告訴你,你做錯了。把它放在源代碼文件的頂部:

Option Strict On 
+1

+1。另外[更改您的VB設置](http://msdn.microsoft.com/en-us/library/zcd4xwzs.aspx),以便爲您創建的每個新源代碼文件啓用「Option Strict」。在工具菜單上,單擊選項。 打開「項目和解決方案」節點。 選擇VB默認值。 修改選項嚴格設置。 – MarkJ 2011-04-13 08:15:08

+0

嗯,不*全* Declare語句是正確的。當FindWindow具有返回值「IntPtr」時,返回值爲「Long」。它看起來像是從一些VB 6代碼複製的。 VB.NET中'Integer'和'Long'的大小已經改變了。將來,請檢查[pinvoke.net](http://www.pinvoke.net/default.aspx/user32.findwindow)以獲取您的聲明;他們將最新的.NET。 – 2011-04-14 05:22:49