关于 winapi GetWindowText 的声明

时间:2022-09-07 21:12:38

    <Runtime.InteropServices.DllImport("user32.dll")> _
     Public Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    End Function

这 不能得到 lpString 

而用 
     Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer

lpString 的值  就是需要的文本

好奇怪啊 

第一种形式 需要修改哪里呢??

12 个解决方案

#1


stringbuilder

#2


引用 1 楼 zanfeng 的回复:
stringbuilder


请说明白一点

stringbuilder  我也用过   

但是在我用 string 的时候  其他都一样 只有声明 不一样  就会有现在的问题

#3


难道是问题太难了么


现在我的问题好多都没有满意答案了

#4


ttttdingding thank you

#5


你说的不够明白

#6


Dim Buff As New String(Chr(0), 256)
Call GetWindowText(hwnd, Buff, 256)
Msgbox Buff.ToString

#7


哦那里说的不够明白啊

Dim Buff As New String(Chr(0), 256)
GetWindowText(hwnd, Buff, 256)

同样上边2句话

但是对 GetWindowText 的声明语句不一样   
Buff 的结果不一样

#8



        [DllImport("user32.dll")]
        public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

c#下面可以用的。你找个网站转成vb的。网上有整套的api 不必一个一个转。

#9


引用 8 楼 zanfeng 的回复:
C# code

        [DllImport("user32.dll")]
        public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);


c#下面可以用的。你找个网站转成vb的……



郁闷了  就是不行啊

#10


111

#11


vb.net 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
End Function


sample code:

Public Function GetText(ByVal hWnd As IntPtr) As String
    Dim length As Integer
    If hWnd.ToInt32 <= 0 Then
        Return Nothing
    End If
    length = GetWindowTextLength(hWnd)
    If length = 0 Then
        Return Nothing
    End If
    Dim sb As New System.Text.StringBuilder("", length + 1)

    GetWindowText(hWnd, sb, sb.Capacity)
    Return sb.ToString()
End Function


参考
http://pinvoke.net/default.aspx/user32.GetWindowText

#12


却是  StringBuilder 问题

我也尝试过的 当时为什么没生效呢? 现在已经能够不知道了

#1


stringbuilder

#2


引用 1 楼 zanfeng 的回复:
stringbuilder


请说明白一点

stringbuilder  我也用过   

但是在我用 string 的时候  其他都一样 只有声明 不一样  就会有现在的问题

#3


难道是问题太难了么


现在我的问题好多都没有满意答案了

#4


ttttdingding thank you

#5


你说的不够明白

#6


Dim Buff As New String(Chr(0), 256)
Call GetWindowText(hwnd, Buff, 256)
Msgbox Buff.ToString

#7


哦那里说的不够明白啊

Dim Buff As New String(Chr(0), 256)
GetWindowText(hwnd, Buff, 256)

同样上边2句话

但是对 GetWindowText 的声明语句不一样   
Buff 的结果不一样

#8



        [DllImport("user32.dll")]
        public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

c#下面可以用的。你找个网站转成vb的。网上有整套的api 不必一个一个转。

#9


引用 8 楼 zanfeng 的回复:
C# code

        [DllImport("user32.dll")]
        public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);


c#下面可以用的。你找个网站转成vb的……



郁闷了  就是不行啊

#10


111

#11


vb.net 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
End Function


sample code:

Public Function GetText(ByVal hWnd As IntPtr) As String
    Dim length As Integer
    If hWnd.ToInt32 <= 0 Then
        Return Nothing
    End If
    length = GetWindowTextLength(hWnd)
    If length = 0 Then
        Return Nothing
    End If
    Dim sb As New System.Text.StringBuilder("", length + 1)

    GetWindowText(hWnd, sb, sb.Capacity)
    Return sb.ToString()
End Function


参考
http://pinvoke.net/default.aspx/user32.GetWindowText

#12


却是  StringBuilder 问题

我也尝试过的 当时为什么没生效呢? 现在已经能够不知道了