2015-07-19 126 views
1

在我的一个项目中,我必须得到前台窗口的标题,所以我调用GetForegroundWindow()入口点窗体User32.dll获取窗口句柄,然后我称为GetWindowText()为标题一切都会出错少但输出什么也没有,这里是我在我的VB.NET程序中使用的代码。GetWindowText没有任何返回

Imports System.Runtime.InteropServices 

Public Class Form1 

<DllImport("user32.dll")> _ 
Private Shared Function GetForegroundWindow() As IntPtr 

End Function 

<DllImport("user32.dll")> _ 
Private Shared Function GetWindowText(ByVal hwnd As Long, ByVal lpString As System.Text.StringBuilder, ByVal cch As Long) As Integer 

End Function 


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
End Sub 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    Dim hWnd As IntPtr 
    hWnd = GetForegroundWindow() 
    Dim title As New System.Text.StringBuilder(256) 
    GetWindowText(hWnd, title, title.Capacity) 
    Me.Text = title.ToString 
End Sub 
End Class 
+0

这是一个VB6的声明,一个旧的VB版本,开始作为一个16位的开发工具。你总是可以通过看到'Long'回来。它是VB.NET中的Integer。通过访问pinvoke.net网站获取最新的声明。 –

回答

1

我找到了自己的解决方案,这是为它必须是IntPtr程序的正常运作hWnd参数为Long值故障。新的正确代码看起来像这样。

Imports System.Runtime.InteropServices 

Public Class Form1 

<DllImport("user32.dll")> _ 
Private Shared Function GetForegroundWindow() As IntPtr 

End Function 

<DllImport("user32.dll")> _ 
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Long) As Integer 

End Function 


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
End Sub 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    Dim hWnd As IntPtr 
    hWnd = GetForegroundWindow() 
    Dim title As New System.Text.StringBuilder(256) 
    GetWindowText(hWnd, title, title.Capacity) 
    Me.Text = title.ToString 


End Sub 
End Class 
+0

你仍然没有弄清楚。 –

+0

@HansPassant为什么? –

+0

正如评论中指出的那样,Long = Integer。你错过了cch的论点。使用该网站。 –