从IntPtr Handle获取Control / Form对象

时间:2012-05-09 14:23:47

标签: c# .net windows handle hwnd

我尝试使用以下代码从显示的Word应用程序窗口获取托管控件:

Process[] processes = null;
processes = Process.GetProcessesByName("WINWORD");
Process wordProc = processes[0];
Control wordControl = Control.FromHandle(wordProc.MainWindowHandle);

不幸的是wordControl始终为null ...据我所知,如果找不到与句柄相关的控件,FromHandle将返回null。但实际上我猜应该有一个相关的控件,因为我可以在屏幕上看到窗口。

因此,我的问题是,如果我在尝试获取句柄或控件时做了一些非常错误的事情。 或许我的一般方法对某些人来说是行不通的,此时这些原因是未知的,基于.NET / Windows环境中的某些原因。

2 个答案:

答案 0 :(得分:2)

你想做的事是不可能的。你不能在自己的进程中运行Word实例并将其转换为C#WinForms控件 - 这将是完全不安全的。

根据您的目的,您可以采取两种方法:

  • 如果要影响现有Word实例的行为,则可以使用SendMessage()和其他各种User32.DLL函数向其发送一些消息。使用Pinvoke / DLL Import完成此操作。

  • 如果您尝试在自己编写的应用中使用Word功能(例如创建word文档),请使用Word interop libraries

修改

如果您对处理现有Word实例中的关键事件感兴趣,可以使用Low Level keyboard hook来处理关键事件,指定您感兴趣的单词proc句柄。

答案 1 :(得分:1)

Control.FromHandle要求您传递托管控件的句柄,而不是win32窗口的MainWindowHandle ...