3

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

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

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

因此我的问题是,如果我在尝试获取手柄或控件时做错了什么。或者,也许我的一般方法不适用于某些基于 .NET / Windows 环境中某处的目前未知的原因。

4

2 回答 2

2

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

根据您要执行的操作,您可以采用两种方法:

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

  • 如果您尝试在您编写的应用程序中使用 Word 功能(例如创建 Word 文档),请使用Word 互操作库

编辑

If you're interested in handling key events in an existing Word instance, you can use a Low Level keyboard hook to deal with key events, specifying the handle of the word procs you're interested in.

于 2012-05-09T14:30:24.703 回答
1

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

于 2012-05-09T14:30:15.700 回答