无法将FindWindow结果设置为.NET

时间:2019-06-06 22:11:23

标签: variables assign findwindow

我正在尝试通过Visual Studio 2017(.NET Framework 4.6.1)和VB.NET使用FindWindow API来检索当前正在运行的Microsoft Word实例的窗口句柄。我发现,尽管它过去曾在一个特定实例中起作用(并且正在代码的另一个区域中起作用),但是尽管FindWindow调用返回的是值,但我无法将其分配给变量。我已经在调试模式下验证了这一点(提供了屏幕截图)。我试图弄清楚为什么在此特定实例中API调用不起作用。

屏幕截图链接:https://imgur.com/a/NuwpUyz

我已经在正在使用的.NET代码的某些区域中执行了此调用,所以我知道它确实有效。我已经更改了“ assignee”变量的定义中的类型(从Object到Integer,到IntPtr等,等等),然后重新运行该应用程序,结果相同(“ assignee”变量最终以a值为零,但FindWindow调用本身返回一个整数值,该值似乎是正确的窗口句柄。

FindWindow API定义:


<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As Integer

End Function

FindWindow API调用:


。 。 。     公共hndMDIWord作为整数 。 。 。 。             如果Word_Previously_Running然后                 尝试                     _mdiWordApp = GetObject(,“ Word.Application”)                 异常捕获                     _mdiWordApp =新Word.Application                 结束尝试             其他                 _mdiWordApp =新Word.Application             万一             hndMDIWord = FindWindow(“ Opusapp”,“”)             如果hndMDIWord <> 0然后                 SetParent(hndMDIWord,Me.Handle.ToInt32())             如果结束


我期望FindWindow返回一个整数,该整数表示Word当前正在运行的实例的窗口句柄,然后将该结果分配给hndMDIWord变量。 FindWindow确实返回了预期的结果,但是hndMDIWord变量的赋值语句未正确执行; hndMDIWord的最终值为零。没有错误,也不会引发异常。

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

此致

克里斯·弗利特伍德

1 个答案:

答案 0 :(得分:0)

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

您需要将返回类型声明为IntPtr

<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As IntPtr

End Function

因为:

也有一个pinvoke.net网站,上面有.net互操作示例,而其中的WinAPI功能却绝大部分。

还需要将hndMDIWord声明为IntPtr并相应地使用它,并且还需要声明其他WinAPI函数以对处理程序也使用IntPtr

Public hndMDIWord As IntPtr 
. . . . 
If hndMDIWord <> IntPtr.Zero Then 
相关问题