Здравствуйте, Matveyka, Вы писали:
M>Задача: надо перебрать все окна всех процессов, запущенных в системе и получить доступ к их заголовкам. Как это сделать?
public partial class MainForm : Form
{
[DllImport("user32.dll")]
static extern int GetWindowText(int hWnd, StringBuilder text, int count);
public MainForm()
{
InitializeComponent();
Process[] procs = Process.GetProcesses();
IntPtr hWnd;
foreach (Process proc in procs)
{
if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
{
const int chars = 256;
StringBuilder Buff = new StringBuilder(chars);
GetWindowText(hWnd.ToInt32(), Buff, chars);
listBoxDomains.Items.Add(String.Format("{0} : {1}", proc.ProcessName, Buff.ToString()));
}
}
}
}
Здравствуйте, ksg71, Вы писали:
K>тогда уж Process.MainWindowTitle
В том-то и дело, что нужно не MAIN window, а ВСЕ окна. Если в notepad в меню выбрать File -> Open, то к окну диалога через Process.MainWindow Вы доступ не получите.
Здравствуйте, Matveyka, Вы писали:
M>Задача: надо перебрать все окна всех процессов, запущенных в системе и получить доступ к их заголовкам. Как это сделать?
Например, так:
var children = AutomationElement.RootElement.FindAll(TreeScope.Children,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
foreach (var item in children.Cast<AutomationElement>())
{
var process = item.GetCurrentPropertyValue(AutomationElement.ProcessIdProperty);
var name = item.GetCurrentPropertyValue(AutomationElement.NameProperty);
Console.WriteLine("{0}: {1}", process, name);
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Например, так: TK>
TK>var children = AutomationElement.RootElement.FindAll(TreeScope.Children,
TK> new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
TK>foreach (var item in children.Cast<AutomationElement>())
TK>{
TK> var process = item.GetCurrentPropertyValue(AutomationElement.ProcessIdProperty);
TK> var name = item.GetCurrentPropertyValue(AutomationElement.NameProperty);
TK> Console.WriteLine("{0}: {1}", process, name);
TK>}
TK>
Отлично! Большое спасибо. Только Ваш метод все-таки перебирает только главные окна процессов. Поэтому для моей задачи пришлось организовать рекурсию. А в целом все чисто и красиво
Здравствуйте, Matveyka, Вы писали:
M>Отлично! Большое спасибо. Только Ваш метод все-таки перебирает только главные окна процессов. Поэтому для моей задачи пришлось организовать рекурсию. А в целом все чисто и красиво
Не факт, что в вашем случае нужна рекурсия. Смотрите на TreeScope.Subtree или TreeScope.Descendants
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Не факт, что в вашем случае нужна рекурсия. Смотрите на TreeScope.Subtree или TreeScope.Descendants
Смотрел.
var children = AutomationElement.RootElement.FindAll(TreeScope.Descendants,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
и
var children = AutomationElement.RootElement.FindAll(TreeScope.Subtree,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
работает слишком долго или подвисает. Во всяком случае, я результата не дождался.
Здравствуйте, Matveyka, Вы писали:
M>Задача: надо перебрать все окна всех процессов, запущенных в системе и получить доступ к их заголовкам. Как это сделать?
Установите глобальный перехватчик (Hook) и делайте все, что вам заблагорассудится.
Под "прицел" попадут все окна, обещаю.