2012-05-09 56 views
3

我尝试使用下面的代码获取从显示Word应用程序窗口的管理控制:获取从IntPtr的控制/表单对象句柄

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

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

因此我的问题是,如果我在尝试获取句柄或控件时做了非常错误的事情。 或者,也许我的一般方法不适用于某些,在这个时候未知的,在.NET/Windows环境中的某个地方的原因。

+0

实际上供您参考: MainWindorHandle返回一个合适的句柄。 – inva

回答

1

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

取决于你想要做什么,有两种方法可以采取:

  • 如果你想影响现有的Word实例的行为,那么你可以把它用SendMessage函数一些信息( )和其他各种User32.DLL函数。使用Pinvoke/DLL Import来完成此操作。

  • 如果你想在你写一个应用程序使用Word功能(例如创建Word文档),然后使用Word interop libraries

编辑

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

+0

谢谢理查德。我希望这不会是这种情况,但永远不会少,我实际上想要做的是捕获打开的Word文档的keydown事件(winAPI)。这样做的代码是一个附加单词。你有一些想法如何实现这一目标? – inva

+0

你的意思是你想在Word中处理任何按键事件? – Richard

+0

是的。我想考虑每个关键 - 至少在第一次尝试。 – inva

1

Control.FromHandle需要你通过管理控制,在Win32窗口不MainWindowHandle ...

+0

这种情况下,管理控制是什么意思?我认为Word申请表可能是一个管理控制。但实际上,我只得到了正在运行的进程的句柄 - 我想这不是管理控制的全部内容,对吧? – inva