Получить контекст окна и список его объектов
подскажите, каким образом в С# получить контекст НЕ СВОЕГО окна и список принадлежащих ему объектов чтобы из своего окна пересылать ему ... текст в текстовые объекты, нажимать кнопки и т.п.
Каждый процесс не имеет доступа к адресному пространству другого, поэтом один процесс не может манипулировать другим, если он не был запущен как дочерний. В WinAPI можно было сделать такую уловку: выставлем своему приложению высшую привилегию SeDebugPrivilege, аттчимся к другому процессу под видом отладчика и копошимся в процессе. В .NET всё сложнее, так как здесь есть Secuiry Permissions. Возьмём класс System.Diagnostics.Process и попробуем чего-нибудь сделать:
using System.Diagnostics;
Process[] processes = Process.GetProcesses("имя нужного процесса");
//может получиться так, что несколько процессов имею одинаковые имена, поэтому ищем нужный
foreach(Process p in processes)
{
if(p.StartInfo.FileName=="имя файла нужного экзешника")
{
IntPtr hWindow = p.MainWindowHandle; //получаем описатель главного окна
Form mainForm = Form.FromHandle(hWindow); //получили экземпляр формы из описателя
ControlCollection childControls = mainForm.Controls;
}
}
Теперь в переменной childControls содержится список всех контролов формы, так что через него можно достучаться до кнопочек и т.д..
MyProcess.Start();
IntPtr hWindow = MyProcess.MainWindowHandle; //получаем описатель главного окна
ControlCollection childControls = new ControlCollection((Form) Form.FromHandle(hWindow));
int ccnt = childControls.Count;
Здесь MyProcess - объект из Tools
ccnt возвращает 0...
А приложения, чей описатель окна ты берёшь, выполняется в среде .NET или это обычное Win32-приложение?
А в чём разница при исполнении-то?
понятия не имею - "чёрный ящик"... скомпилированный EXE-шник... ну 32 разрядный....в смысле что не 16-ти
по идее система должна отвести ему пул, назначить окну описатель и занести его в реестр исполняемых приложений вместе с объектами внутри его
ОПИСАТЕЛЬ-то есть....только объекты внутри наверное надо адресовать как-то иначе.
Ты описал всё почти правильно - в MSDN так же... но там не описано как достучаться к контролам внутри
Попробуй WinAPI, например получив описатель главного окна, путём описанным 3A3-968M можно вызвать HWND GetWindow(HWND hWnd,UINT uCmd);
GW_CHILD
The retrieved handle identifies the child window at the top of the Z order, if the specified window is a parent window; otherwise, the retrieved handle is NULL. The function examines only child windows of the specified window. It does not examine descendant windows.
GW_ENABLEDPOPUP
Windows 2000/XP: The retrieved handle identifies the enabled popup window owned by the specified window (the search uses the first such window found using GW_HWNDNEXT); otherwise, if there are no enabled popup windows, the retrieved handle is that of the specified window.
GW_HWNDFIRST
The retrieved handle identifies the window of the same type that is highest in the Z order. If the specified window is a topmost window, the handle identifies the topmost window that is highest in the Z order. If the specified window is a top-level window, the handle identifies the top-level window that is highest in the Z order. If the specified window is a child window, the handle identifies the sibling window that is highest in the Z order.
GW_HWNDLAST
The retrieved handle identifies the window of the same type that is lowest in the Z order. If the specified window is a topmost window, the handle identifies the topmost window that is lowest in the Z order. If the specified window is a top-level window, the handle identifies the top-level window that is lowest in the Z order. If the specified window is a child window, the handle identifies the sibling window that is lowest in the Z order.
GW_HWNDNEXT
The retrieved handle identifies the window below the specified window in the Z order. If the specified window is a topmost window, the handle identifies the topmost window below the specified window. If the specified window is a top-level window, the handle identifies the top-level window below the specified window. If the specified window is a child window, the handle identifies the sibling window below the specified window.
GW_HWNDPREV
The retrieved handle identifies the window above the specified window in the Z order. If the specified window is a topmost window, the handle identifies the topmost window above the specified window. If the specified window is a top-level window, the handle identifies the top-level window above the specified window. If the specified window is a child window, the handle identifies the sibling window above the specified window.
GW_OWNER
The retrieved handle identifies the specified window's owner window, if any. For more information, see Owned Windows.
А затем, получив описатели дочерних элементов, работать с окнами(контролами) окна. Не знаю удастся ли получить экземпляр класса Control, по хендлу, попробуй ;)
[DllImport("user32.dll")]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
По работе с WinAPI функциями через C# есть ссылка на этом форуме в ветке "C# и API".