2012-05-09 4 views
3

Я пытаюсь получить управляемый контроль от показанного окна Слова приложения с помощью следующего кода:Получить контроль объекта/Формы от 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 Control - это было бы совершенно небезопасно.

В зависимости от того, что вы хотите сделать, есть два подхода, которые Вы можете взять с собой:

  • Если вы хотите, чтобы повлиять на поведение существующего экземпляра Word, то вы можете послать ему некоторые сообщения с помощью SendMessage () и другие различные функции User32.DLL. Используйте Pinvoke/DLL Import, чтобы выполнить это.

  • Если вы пытаетесь использовать функциональные возможности Word, в приложении вы написали (например, создать текстовый документ), а затем использовать Word interop libraries:

Редактировать

Если вы заинтересованы в обращении ключевые события в существующем экземпляре Word, вы можете использовать Low Level keyboard hook для обработки ключевых событий, указав дескриптор интересующего вас слова proc.

+0

спасибо Ричарду. Я надеялся, что это будет не так, но тем не менее, что я на самом деле пытаюсь сделать, это захватить событие keydown (winAPI) открытого Word Document. Код, выполняющий это, - это добавление слова. У вас есть идея, как этого добиться? – inva

+0

Вы имеете в виду, что хотите обрабатывать любые события нажатия клавиш в Word? – Richard

+0

есть. Я хочу рассмотреть каждую клавишу вниз - при первой попытке, по крайней мере. – inva

1

Control.FromHandle требует, чтобы передать дескриптор управляемого управления, а не MainWindowHandle окна win32 ...

+0

Что означает управляемый контроль в этом случае? Я думал, что форма приложения Word может быть управляемым. Но на самом деле, я получил только ручку запущенного процесса - я думаю, что это не тот управляемый элемент управления, не так ли? – inva

Смежные вопросы