VB.NET 中 GetClassName 的使用?

a854468521 2009-06-11 08:31:52
//声明:
GetClassName(
hWnd: HWND; {指定窗口句柄}
lpClassName: PChar; {缓冲区}
nMaxCount: Integer {缓冲区大小}
): Integer; {返回类名大小; 失败返回 0}


Private Declare Function GetClassName _
Lib "user32" _
Alias "GetClassNameA" ( _
ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) _
As Long
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
Dim ClassName As String
'该句为VB6.0语句,需转换为VB.NET
' ClassName = String(255, Chr(0))
'示例取出目前本程序的类名称。
GetClassName(Me.Handle.ToInt32, ClassName, 255)
’获得指定进程的类名称。

End Sub

不能正确获得进程的类名称(不用反射)
...全文
438 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
a854468521 2009-06-11
  • 打赏
  • 举报
回复
已找到原因,参数传递错误,谢谢大家。
a854468521 2009-06-11
  • 打赏
  • 举报
回复
<DllImport("User32.Dll")> Public Shared Function GetClassName(ByVal h As Int32, ByVal s As StringBuilder, ByVal nMaxCount As Int32) As Long
End Function
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Exc = New Microsoft.Office.Interop.Excel.Application
Exc.Workbooks.Add()
Exc.Visible = True
Me.TextBox1.Text = Exc.Hwnd
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click

Dim sb As New StringBuilder(255)
'Me.Text = GetClassName(Me.Handle, sb, sb.Capacity - 1)
Me.Text = GetClassName(Exc.Hwnd, sb, sb.Capacity)
MsgBox(sb.ToString)
返回 XLMIAN
'Exc.Quit()
End Sub
所读出的数据和在EXCEL用VBA 读出的不一样?

'//取得类名
Private Declare Function GetClassName _
Lib "user32" _
Alias "GetClassNameA" ( _
ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) _
As Long
sub sy
ClassName = String(255, Chr(0))
GetClassName application.Hwnd, ClassName, 255
ClassName = Left(ClassName, InStr(ClassName, vbNullChar) - 1)
返回:EXCEL6
end sub

在VBA和VB.NET返回值不一样,GetClassName (传入的句柄一样),为什么呢?


古今多少事 2009-06-11
  • 打赏
  • 举报
回复
学习了!
feiyun0112 2009-06-11
  • 打赏
  • 举报
回复
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal className As System.Text.StringBuilder, ByVal buffersize As Integer) As Integer

Dim s As New System.Text.StringBuilder(256)
GetClassName(Me.Handle.ToInt32, s, s.Capacity)
MsgBox s.ToString


*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
cnzdgs 2009-06-11
  • 打赏
  • 举报
回复 1
VB.NET中的Long类型与VB6不同,是64位整数,声明GetClassName时要用UInt32。
Private Declare Auto Function GetClassName Lib "user32" (ByVal hwnd As UInt32, ByVal lpClassName As String, ByVal nMaxCount As UInt32) As UInt32

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
Dim ClassName As New String(ChrW(0), 255)
GetClassName(Me.Handle, ClassName, 255)
End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧