我正在尝试通过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的最终值为零。没有错误,也不会引发异常。
当然,我们将不胜感激任何建议和/或见解。
此致
克里斯·弗利特伍德
答案 0 :(得分:0)
我认为问题是:IntPtr
与Integer
不兼容。
您需要将返回类型声明为IntPtr
:
<DllImport("user32.dll")>
Public Shared Function FindWindow(ByVal strclassName As String, ByVal strWindowName As String) As IntPtr
End Function
因为:
IntPtr
也有一个pinvoke.net网站,上面有.net
互操作示例,而其中的WinAPI
功能却绝大部分。
还需要将hndMDIWord
声明为IntPtr
并相应地使用它,并且还需要声明其他WinAPI函数以对处理程序也使用IntPtr
:
Public hndMDIWord As IntPtr
. . . .
If hndMDIWord <> IntPtr.Zero Then