Посмотреть заголовки всех окон
От: Matveyka Россия  
Дата: 14.01.10 12:13
Оценка:
Задача: надо перебрать все окна всех процессов, запущенных в системе и получить доступ к их заголовкам. Как это сделать?
Re: Посмотреть заголовки всех окон
От: DrWolf  
Дата: 14.01.10 13:28
Оценка:
Здравствуйте, 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()));
                }
            }        
        }
    }
Re[2]: Посмотреть заголовки всех окон
От: ksg71 Германия  
Дата: 14.01.10 13:36
Оценка: 14 (1)
Здравствуйте, DrWolf, Вы писали:

DW> static extern int GetWindowText(int hWnd, StringBuilder text, int count);


тогда уж Process.MainWindowTitle
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[3]: Посмотреть заголовки всех окон
От: DrWolf  
Дата: 14.01.10 13:46
Оценка:
Здравствуйте, ksg71, Вы писали:
K>тогда уж Process.MainWindowTitle

да, действитльено )
Re[3]: Посмотреть заголовки всех окон
От: Matveyka Россия  
Дата: 14.01.10 18:44
Оценка:
Здравствуйте, ksg71, Вы писали:

K>тогда уж Process.MainWindowTitle


В том-то и дело, что нужно не MAIN window, а ВСЕ окна. Если в notepad в меню выбрать File -> Open, то к окну диалога через Process.MainWindow Вы доступ не получите.
Re[2]: Посмотреть заголовки всех окон
От: Matveyka Россия  
Дата: 14.01.10 18:52
Оценка: 4 (1)
Здравствуйте, DrWolf:

Большое спасибо за идею. В моем случае придется еще и перебирать все окна процесса, но GetWindowText меня спасает.

Получится что-то вроде этого:



 public partial class MainForm : Form
    {
        [DllImport("user32.dll")]
        static extern int GetWindowText(int hWnd, StringBuilder text, int count);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        public MainForm()
        {
            InitializeComponent();

            for (IntPtr handle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, null);
                 handle != IntPtr.Zero;
                 handle = FindWindowEx(IntPtr.Zero, handle, null, null))
            {
                 const int chars = 256;
                 StringBuilder Buff = new StringBuilder(chars);
                 GetWindowText(hhandle.ToInt32(), Buff, chars);
                 listBoxDomains.Items.Add(Buff.ToString());
            }
        }
    }
Re: Посмотреть заголовки всех окон
От: TK Лес кывт.рф
Дата: 15.01.10 17:10
Оценка: 13 (2)
Здравствуйте, 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);
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Посмотреть заголовки всех окон
От: Matveyka Россия  
Дата: 19.01.10 12:58
Оценка:
Здравствуйте, 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>


Отлично! Большое спасибо. Только Ваш метод все-таки перебирает только главные окна процессов. Поэтому для моей задачи пришлось организовать рекурсию. А в целом все чисто и красиво
Re[3]: Посмотреть заголовки всех окон
От: TK Лес кывт.рф
Дата: 19.01.10 13:20
Оценка:
Здравствуйте, Matveyka, Вы писали:

M>Отлично! Большое спасибо. Только Ваш метод все-таки перебирает только главные окна процессов. Поэтому для моей задачи пришлось организовать рекурсию. А в целом все чисто и красиво


Не факт, что в вашем случае нужна рекурсия. Смотрите на TreeScope.Subtree или TreeScope.Descendants
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Посмотреть заголовки всех окон
От: Matveyka Россия  
Дата: 19.01.10 13:34
Оценка:
Здравствуйте, 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));


работает слишком долго или подвисает. Во всяком случае, я результата не дождался.
Re: Посмотреть заголовки всех окон
От: okman Беларусь https://searchinform.ru/
Дата: 20.01.10 10:08
Оценка:
Здравствуйте, Matveyka, Вы писали:

M>Задача: надо перебрать все окна всех процессов, запущенных в системе и получить доступ к их заголовкам. Как это сделать?


Установите глобальный перехватчик (Hook) и делайте все, что вам заблагорассудится.
Под "прицел" попадут все окна, обещаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.