Показать сообщение отдельно
Старый 02.11.2013, 23:23   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Пару вопросов на счет окон.

Примерно так:
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();


        }
    }

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
riot (02.11.2013)