Показать сообщение отдельно
Старый 02.11.2013, 22:44   #12
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;
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();


        }
    }

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