我正在尝试使用Visual Studio 2017(.NET Framework 4.6.1)的FindWindow API,VB.NET 检索当前运行的Microsoft Word实例的窗口句柄。 我发现,尽管它过去在一个特定实例中已经工作(并且正在代码的另一个区域工作),尽管 FindWindow 调用返回了一个值,但我无法将其分配给变量。 我已经在调试模式下验证了这一点(屏幕截图可用)。 我试图弄清楚为什么 API 调用在此特定实例中不起作用。
截图链接:https://i.stack.imgur.com/iTRm1.jpg
我已经在我正在使用的 .NET 代码的某些区域中执行了此调用,因此我知道它确实有效。 我已经更改了"受让人"变量定义中的类型(从对象到整数,到IntPtr等)并重新运行应用程序,结果相同("受让人"变量最终值为零,但FindWindow调用本身返回一个整数值,该值似乎是正确的窗口句柄。
FindWindow API 定义:
<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As Integer
End Function
FindWindow API 调用:
. . . Public hndMDIWord As Integer . . . . 如果Word_Previously_Running则 尝试 _mdiWordApp = GetObject(, "Word.Application") 捕获 ex 作为例外 _mdiWordApp = New Word.Application 结束尝试 还 _mdiWordApp = New Word.Application 结束如果 hndMDIWord = FindWindow("Opusapp", ") 如果 hndMDI <> 0 则 SetParent(hndMDIWord, Me.Handle.ToInt32()) 结束如果
我希望 FindWindow 返回一个整数,表示当前运行的 Word 实例的窗口句柄,然后将该结果分配给 hndMDIWord 变量。 FindWindow 确实返回了预期的结果,但 hndMDIWord 变量的赋值语句无法正确执行;hndMDIWord 最终的值为零。 没有错误,也不会引发异常。
当然,任何建议和/或见解将不胜感激。
问候
克里斯·弗利特伍德
我认为问题是:IntPtr
与Integer
不兼容。
您需要将返回类型声明为IntPtr
:
<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As IntPtr
End Function
因为:
- FindWindow 具有 HWND 返回类型
- 从 MSDN 句柄封送为
IntPtr
此外,还有一个 pinvoke.net 网站,其中包含.net
与大多数WinAPI
函数的互操作示例。
此外,还需要将hndMDIWord
声明为IntPtr
并相应地使用,并且还需要声明其他 WinAPI 函数以将IntPtr
用于处理程序:
Public hndMDIWord As IntPtr
. . . .
If hndMDIWord <> IntPtr.Zero Then
在我的表单或模块的顶部,我像这样声明 API:
Private Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
然后我像这样使用 FindWindow:
Dim hndMDIWord As IntPtr = FindWindow("OpusApp", "Word")
If hndMDIWord <> IntPtr.Zero Then
MsgBox(hndMDIWord)
End If
这对我有用。如果您不知道类名参数,则很痛苦。我使用一个名为WinLister的很棒的小应用程序来获取类名。谷歌一下。