无法在 .NET 中将查找窗口结果设置为变量



我正在尝试使用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 最终的值为零。 没有错误,也不会引发异常。

当然,任何建议和/或见解将不胜感激。

问候

克里斯·弗利特伍德

我认为问题是:IntPtrInteger不兼容。

您需要将返回类型声明为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的很棒的小应用程序来获取类名。谷歌一下。

相关内容

  • 没有找到相关文章

最新更新