forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Пару вопросов на счет окон. (http://forum.boolean.name/showthread.php?t=15562)

radiobutton 30.09.2011 05:14

Пару вопросов на счет окон.
 
Как получить список всех открытых окон? (их handle)
Как узнать координаты и размеры окна по его handle.
Как изменить координаты и размеры окна по его handle.
Как прочитать заголовок окна по его handle.
???

pax 30.09.2011 09:24

Ответ: Пару вопросов на счет окон.
 
Вам дорога в WinAPI. Стандартных средств в NetFramework вроде нет для таких целей.

Получение окон:
PHP код:

private delegate bool EnumWindowsProc(IntPtr hWndIntPtr lParam);

      
[
DllImport("user32.dll"CharSet CharSet.AutoSetLastError true)]
private static 
extern bool EnumWindows(EnumWindowsProc callbackIntPtr extraData); 

Получение размера:
PHP код:

[DllImport("user32.dll")]
private static 
extern bool GetWindowRect(IntPtr hWndref Rectangle rect); 


и т.д.
Вобщем ищите тут: Window Functions

radiobutton 04.10.2011 10:35

Ответ: Пару вопросов на счет окон.
 
Кстати, ради интереса.
Что означают эти флаги?)

CharSet = CharSet.Auto, SetLastError = true

кстати заметил багу +) У выдоваемого прямоугольника свойства Height и Width эквивалентны значениям Bottom и Right(тем что должны быть на самом деле). Bottom и Right получаются совсем бредовыми,
т.к. они равны Height + Top и Width + Left соответственно.
Но при неправильных Height и Width , получается что Bottom = Height + 2*Top и Right = Width + 2*Left (с правильными Height и Width).

pax 04.10.2011 18:05

Ответ: Пару вопросов на счет окон.
 
Учитесь справкой пользоваться ;)
http://msdn.microsoft.com/ru-ru/libr...tribute. aspx

riot 01.11.2013 03:36

Ответ: Пару вопросов на счет окон.
 
Прошу прощения. Я совсем начинающий программист и обладаю минимальными познаниями. Я медленно и уверено продолжаю своё обучение. И пробую написание простейших программ. У меня убедительная просьба не игнорить меня как это делали на других форумах.

Дело в том что я столкнулся с проблемой(для меня) это API(EnumWindows function в частности), и ни как не могу понять принцип её работы. И не могу найти подходящей для меня(чайника) статьи урока на русском где разжёвано описывалось нужная информация.

Я прошу помогите найти что-нибудь. Или попробуйте объяснить как мне использовать эту функцию EnumWindows function . Я хочу вывести все окна выбранного мной процесса на консоль. Привожу код. Может быть поправите мой код полностью , а я попробую сообразить что и как для чего делалась. Постараюсь больше не кляньчить ...

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace pb0._1
{
    class Program
    {

        private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern bool EnumWindows(EnumWindowsProc callback, IntPtr extraData);

        static void Main(string[] args)
        {
            System.Diagnostics.Process[] allprocess = System.Diagnostics.Process.GetProcesses();
            Console.WriteLine("Создана allprocess, в неё записаны все процессы. Количество : " + allprocess.Length);

            System.Diagnostics.Process[] xxxprocess = System.Diagnostics.Process.GetProcessesByName("xxx");
            Console.WriteLine("Создана xxxprocess, в неё записаны процессы с именем xxx. Количество : " + xxxprocess.Length);

            // Console.WriteLine("{0}", allprocess); // вывести имя процесса под номером указанном в "{}"

            // проинициализировать переменную NeedHandle
            foreach (System.Diagnostics.Process anti in System.Diagnostics.Process.GetProcesses()) // перебираем все процесы
            {
                if (anti.MainWindowTitle.ToString() == "abcd") // находим окно по точному заголовку окна
            //  if (anti.MainWindowTitle.StartsWith("abcd")) // находим окно по первой букве заголовка окна
                {
                    Console.WriteLine("Найдено окно c заголовком abcd");
                    IntPtr handle = anti.MainWindowHandle;
                    Console.WriteLine("Создаём IntPtr handle переменную и присваиваем ей указатель на найденое окно");
                }
            }

           

            Console.ReadLine();

            // using System.Diagnostics;
            // using System.IO;
            // Process process = Process.GetProcesses().FirstOrDefault(x => x.ProcessName == "calc");
            // IntPtr handle = (process != null) ? process.MainWindowHandle : IntPtr.Zero;

        }
    }
}


pax 01.11.2013 07:15

Ответ: Пару вопросов на счет окон.
 
Я думаю тебе поможет второй ответ вот тут: http://stackoverflow.com/questions/2...cess-using-net

riot 01.11.2013 20:14

Ответ: Пару вопросов на счет окон.
 
Спасибо. Код делает именно то что мне нужно. Пытаюсь понять как он работает, но без подходящего урока нечего не выходит.

pax 02.11.2013 09:21

Ответ: Пару вопросов на счет окон.
 
EnumThreadWindows - перебирает окна указанного потока
EnumerateProcessWindowHandles - для переданного id процесса получает все потоки и для каждого потока вызывает функцию EnumThreadWindows с лямбда-выражением - функция которая записывает хэндлы окон в коллекцию.
SendMessage с мессаджем WM_GETTEXT получает текст окна по его хэндлу, потом этот текст выводится в консоль.

riot 02.11.2013 17:52

Ответ: Пару вопросов на счет окон.
 
Вопрос немного про другую функцию
FindWindow("Class", "Windows")
Можноли присвоить с помощью её указатель на окно зная только имя класса? Название окна постоянно меняется, а окно с нужным классом единственное.

riot 02.11.2013 18:04

Ответ: Пару вопросов на счет окон.
 
Сам нашёл ответ на свой глупый вопрос, может быть кому-то будет полезным.
Вместо неизвестного имени окна ставим значение null
FindWindow("Class", null)
Поправьте если чтото не так.

И сразу возникает второй вопрос. А если всёже этих окон будет больше чем одно. Как присвоить каждому указатель на окно?

riot 02.11.2013 21:12

Ответ: Пару вопросов на счет окон.
 
Как должна выглядеть запись чтобы FindWindow искало только в указанном процессе?

pax 02.11.2013 22:44

Ответ: Пару вопросов на счет окон.
 
Собрал в один исходник

PHP код:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace 
ConsoleApplication1
{
    class 
Program
    
{
        
delegate bool EnumThreadDelegate(IntPtr hWndIntPtr lParam);

        [
DllImport("user32.dll")]
        static 
extern bool EnumThreadWindows(int dwThreadIdEnumThreadDelegate lpfn,
            
IntPtr lParam);

        static 
IEnumerable<IntPtrEnumerateProcessWindowHandles(int processId)
        {
            var 
handles = new List<IntPtr>();

            foreach (
ProcessThread thread in Process.GetProcessById(processId).Threads)
                
EnumThreadWindows(thread.Id,
                    (
hWndlParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

            return 
handles;
        }

        private const 
uint WM_GETTEXT 0x000D;

        [
DllImport("user32.dll"CharSet CharSet.Auto)]
        static 
extern IntPtr SendMessage(IntPtr hWnduint Msgint wParam,
            
StringBuilder lParam);


        [
DllImport("user32.dll"CharSet CharSet.Auto)]
        public static 
extern int GetClassName(IntPtr hWnd,
           
StringBuilder lpClassName,
           
int nMaxCount
        
);

        public static 
string GetWindowClassName(IntPtr hWnd)
        {
            
StringBuilder buffer = new StringBuilder(128);
            
GetClassName(hWndbufferbuffer.Capacity);
            return 
buffer.ToString().Trim();
        }


        public static 
string GetWindowName(IntPtr hWnd)
        {
            
StringBuilder message = new StringBuilder(1000);
            
SendMessage(hWndWM_GETTEXTmessage.Capacitymessage);
            return 
message.ToString().Trim();
        }


        public static 
IntPtr FindWindowByNameInProcess(string windowNamestring processName)
        {
            var 
processWindowHandles EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id);

            foreach (var 
handle in processWindowHandles)
            {
                if (
GetWindowName(handle).StartsWith(windowName))
                {
                    return 
handle;
                }
            }

            return 
IntPtr.Zero;
        }

        public static 
IntPtr FindWindowByClassInProcess(string windowClassNamestring processName)
        {
            var 
processWindowHandles EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id);

            foreach (var 
handle in processWindowHandles)
            {
                if (
GetWindowClassName(handle).StartsWith(windowClassName))
                {
                    return 
handle;
                }
            }

            return 
IntPtr.Zero;
        }

        [
STAThread]
        static 
void Main(string[] args)
        {
            foreach (var 
handle in EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id))
            {
                
Console.WriteLine("Name: "+GetWindowName(handle));
                
Console.WriteLine("Class: " GetWindowClassName(handle));
            }

            
// поиск по имени класса
            
var hwnd FindWindowByClassInProcess("tool""explorer");
            if (
hwnd != IntPtr.Zero)
            {
                
Console.WriteLine("Finded Name: " GetWindowName(hwnd));
                
Console.WriteLine("Finded Class: " GetWindowClassName(hwnd));
            }

            
// поиск по имени окна
            
hwnd FindWindowByNameInProcess("Перек""explorer");
            if (
hwnd != IntPtr.Zero)
            {
                
Console.WriteLine("Finded Name: " GetWindowName(hwnd));
                
Console.WriteLine("Finded Class: " GetWindowClassName(hwnd));
            }

            
Console.ReadLine();


        }
    }



riot 02.11.2013 22:57

Ответ: Пару вопросов на счет окон.
 
Спасибо большое, за твою помощь. Сейчас буду вникать в твой код.

У меня появился ещё вопрос. Про функцию EnumChildWindows.

Console.WriteLine(EnumChildWindows(hwnd, xxx, yyy );

Что нужно указать вместо ххх и yyy?

Привожу код.

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace proba01
{
    class Program
    {

        delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

        static void Main(string[] args)
        {

            IntPtr hwnd = FindWindow("Class", null);

            if (hwnd == IntPtr.Zero)
            {
                Console.WriteLine("окно не найдено");
            }
            else
            {
                Console.WriteLine("окно найдено. Указатель : "+hwnd);
                Console.WriteLine(EnumChildWindows(hwnd, xxx, yyy );
            }
            Console.ReadKey();
        }
    }
}


pax 02.11.2013 23:23

Ответ: Пару вопросов на счет окон.
 
Примерно так:
PHP код:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace 
ConsoleApplication1
{
    class 
Program
    
{
        
delegate bool EnumThreadDelegate(IntPtr hWndIntPtr lParam);

        [
DllImport("user32.dll")]
        static 
extern bool EnumThreadWindows(int dwThreadIdEnumThreadDelegate lpfn,
            
IntPtr lParam);

        static 
IEnumerable<IntPtrEnumerateProcessWindowHandles(int processId)
        {
            var 
handles = new List<IntPtr>();

            foreach (
ProcessThread thread in Process.GetProcessById(processId).Threads)
                
EnumThreadWindows(thread.Id,
                    (
hWndlParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

            return 
handles;
        }

        private const 
uint WM_GETTEXT 0x000D;

        [
DllImport("user32.dll"CharSet CharSet.Auto)]
        static 
extern IntPtr SendMessage(IntPtr hWnduint Msgint wParam,
            
StringBuilder lParam);


        [
DllImport("user32.dll"CharSet CharSet.Auto)]
        public static 
extern int GetClassName(IntPtr hWnd,
           
StringBuilder lpClassName,
           
int nMaxCount
        
);

        public static 
string GetWindowClassName(IntPtr hWnd)
        {
            
StringBuilder buffer = new StringBuilder(128);
            
GetClassName(hWndbufferbuffer.Capacity);
            return 
buffer.ToString().Trim();
        }


        public static 
string GetWindowName(IntPtr hWnd)
        {
            
StringBuilder message = new StringBuilder(1000);
            
SendMessage(hWndWM_GETTEXTmessage.Capacitymessage);
            return 
message.ToString().Trim();
        }


        public static 
IntPtr FindWindowByNameInProcess(string windowNamestring processName)
        {
            var 
processWindowHandles EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id);

            foreach (var 
handle in processWindowHandles)
            {
                if (
GetWindowName(handle).StartsWith(windowName))
                {
                    return 
handle;
                }
            }

            return 
IntPtr.Zero;
        }

        public static 
IntPtr FindWindowByClassInProcess(string windowClassNamestring processName)
        {
            var 
processWindowHandles EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id);

            foreach (var 
handle in processWindowHandles)
            {
                if (
GetWindowClassName(handle).StartsWith(windowClassName))
                {
                    return 
handle;
                }
            }

            return 
IntPtr.Zero;
        }

        public 
delegate bool EnumWindowsProc(IntPtr hWndIntPtr lParam);

        [
DllImport("USER32.DLL"CharSet CharSet.Unicode)]
        public static 
extern IntPtr FindWindow(string lpClassNamestring lpWindowName);

        [
DllImport("user32.dll"SetLastError true)]
        [return: 
MarshalAs(UnmanagedType.Bool)]
        public static 
extern bool EnumChildWindows(IntPtr hWndParentEnumWindowsProc lpEnumFuncIntPtr lParam);


        [
STAThread]
        static 
void Main(string[] args)
        {
            foreach (var 
handle in EnumerateProcessWindowHandles(
                
Process.GetProcessesByName("explorer").First().Id))
            {
                
Console.WriteLine("Name: " GetWindowName(handle));
                
Console.WriteLine("Class: " GetWindowClassName(handle));
            }

            
// поиск по имени класса
            
var hwnd FindWindowByClassInProcess("tool""explorer");
            if (
hwnd != IntPtr.Zero)
            {
                
Console.WriteLine("Finded Name: " GetWindowName(hwnd));
                
Console.WriteLine("Finded Class: " GetWindowClassName(hwnd));
            }

            
// поиск по имени окна
            
hwnd FindWindowByNameInProcess("Меню""explorer");
            if (
hwnd != IntPtr.Zero)
            {
                
Console.WriteLine("Finded Name: " GetWindowName(hwnd));
                
Console.WriteLine("Finded Class: " GetWindowClassName(hwnd));

                var 
childWindows = new List<IntPtr>();

                
EnumChildWindows(
                    
hwnd,
                    (
childHandlelParam) =>
                    {
                        
childWindows.Add(childHandle);
                        return 
true;
                    },
                    
IntPtr.Zero);

                foreach (var 
handle in childWindows)
                {
                    
Console.WriteLine("Child Window Name: " GetWindowName(handle));
                    
Console.WriteLine("Child Window Class: " GetWindowClassName(handle));
                }
            }

            
Console.ReadLine();


        }
    }



riot 02.11.2013 23:28

Ответ: Пару вопросов на счет окон.
 
Спасибо ещё раз, материала переваривать предостаточно +_-


Часовой пояс GMT +4, время: 19:27.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot