Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получить контекст окна и список его объектов

270
27 мая 2006 года
Drew
265 / / 20.07.2000
подскажите, каким образом в С# получить контекст НЕ СВОЕГО окна и список принадлежащих ему объектов чтобы из своего окна пересылать ему ... текст в текстовые объекты, нажимать кнопки и т.п.
273
27 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
Цитата:
Originally posted by Drew
подскажите, каким образом в С# получить контекст НЕ СВОЕГО окна и список принадлежащих ему объектов чтобы из своего окна пересылать ему ... текст в текстовые объекты, нажимать кнопки и т.п.


Каждый процесс не имеет доступа к адресному пространству другого, поэтом один процесс не может манипулировать другим, если он не был запущен как дочерний. В 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 содержится список всех контролов формы, так что через него можно достучаться до кнопочек и т.д..

270
28 мая 2006 года
Drew
265 / / 20.07.2000
попробовал ...

MyProcess.Start();
IntPtr hWindow = MyProcess.MainWindowHandle; //получаем описатель главного окна
ControlCollection childControls = new ControlCollection((Form) Form.FromHandle(hWindow));
int ccnt = childControls.Count;

Здесь MyProcess - объект из Tools
ccnt возвращает 0...
273
29 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
А приложения, чей описатель окна ты берёшь, выполняется в среде .NET или это обычное Win32-приложение?
270
29 мая 2006 года
Drew
265 / / 20.07.2000
Цитата:
Originally posted by 3A3-968M
А приложения, чей описатель окна ты берёшь, выполняется в среде .NET или это обычное Win32-приложение?


А в чём разница при исполнении-то?
понятия не имею - "чёрный ящик"... скомпилированный EXE-шник... ну 32 разрядный....в смысле что не 16-ти
по идее система должна отвести ему пул, назначить окну описатель и занести его в реестр исполняемых приложений вместе с объектами внутри его
ОПИСАТЕЛЬ-то есть....только объекты внутри наверное надо адресовать как-то иначе.
Ты описал всё почти правильно - в MSDN так же... но там не описано как достучаться к контролам внутри

713
29 мая 2006 года
Ap0k
360 / / 13.03.2006
В данном случае .NET вряд ли чем-то поможет.
Попробуй 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, по хендлу, попробуй ;)

273
29 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
Windows Forms контролы не умеют хавать Native Handle, то есть обычные описатели Win32 GUI приложений, уже проверял. То, что не получится поуправлять Win32-приложением через .NET приложение это точно. Тем более, используя WinAPI мы приобретаем проблему переносимости. Хотя, если она не имеет значения, то пишем обёртки для нужных WinAPI функций на C# и выполняем PInvoke. Например, так:
[DllImport("user32.dll")]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
По работе с WinAPI функциями через C# есть ссылка на этом форуме в ветке "C# и API".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог