Я пытаюсь получить доступ к определенному окну, используя его дескриптор (это значение System.IntPtr
):
// Getting the process of Visual Studio program
var process = Process.GetProcessesByName("devenv")[0];
// Showing the handle we've got, we've no problem
MessageBox.Show(this, process.MainWindowHandle.ToString());
// Attempting to get the main window object by its handle
var wnd = NativeWindow.FromHandle(process.MainWindowHandle);
// always fails
if (wnd == null)
MessageBox.Show("Failed");
else
MessageBox.Show(wnd.ToString(), "Yeeeeees!!");
Я также попытался получить доступ к главному окну другого демо-приложения .net winforms, которое я сделал для этой цели (т.е. я запустил демонстрационное приложение и попытался получить доступ к его главному окну с помощью этого приложения), и тоже потерпел неудачу, хотя оба демо и это приложение являются приложениями .NET. Тем не менее, это успехи:
var process2 = Process.GetCurrentProcess();
MessageBox.Show(this, process2.MainWindowHandle.ToString());
var wnd2 = NativeWindow.FromHandle(process2.MainWindowHandle);
if (wnd2 == null)
MessageBox.Show("Failed");
else
MessageBox.Show(wnd2.ToString(), "Yes");
Я думаю, что это работает, потому что вызывается из того же приложения. Итак, как я могу получить доступ к объекту окна другой программы по его дескриптору? Я думал, что это может работать, используя C\C++
, используя заголовочный файл <windows.h>
, а затем используя P\invoke.
Если я не могу, есть ли другой способ получить доступ к окну (то есть вместо использования дескрипторов)?
=================== ИЗМЕНИТЬ
Я хочу иметь дело со всем объектом окна и его собственными элементами управления.
System.Windows.Automation
? Его целью является манипулирование элементами управления других приложений! - person Raymond Chen   schedule 23.05.2012