Найти окно стороннего приложения по заголовку - C#

Узнай цену своей работы

Формулировка задачи:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace FindWindowByTitle
{
    public partial class Form1 : Form
    {
        [DllImport("USER32.DLL")]
        private static extern int GetWindowText(IntPtr IntPtr, StringBuilder lpString, int nMaxCount);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, string winName);
        public delegate bool EnumWindowProc(IntPtr hWnd, string winName);
 
        public Form1()
        {
            InitializeComponent();
        }
        
        bool FindWindowByTitle(IntPtr hwnd, string winName)
        {
            StringBuilder str = new StringBuilder(200);
            GetWindowText(hwnd, str, 200);
            if (!str.ToString().Contains(winName))
                return true;
            return false;
        }
 
        private void Form1_Click(object sender, EventArgs e)
        {
            Process p= Process.GetProcessesByName("impacthost")[0];
            IntPtr hwin = new IntPtr();
            hwin = p.MainWindowHandle;
            EnumChildWindows(hwin, new EnumWindowProc(FindWindowByTitle), "Gq_MvWorkspace");
        }
    }
}
Функция

FindWindowByTitle

правильно находит искомое окно, возвращает false. Но как теперь по выходе из

FindWindowByTitle

получить найденный десктиптор? Была надежда, что он будет передан в переменную

hwin

, но она осталась неизменной. Как тут быть?

Решение задачи: «Найти окно стороннего приложения по заголовку»

textual
Листинг программы
using System;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace WindowsFormsApplication107
{
    public partial class Form1 : Form
    {
        [DllImport("USER32.DLL")]
        private static extern int GetWindowText(IntPtr IntPtr, StringBuilder lpString, int nMaxCount);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, WindowFinderInfo winName);
        public delegate bool EnumWindowProc(IntPtr hWnd, WindowFinderInfo winName);
        public Form1()
        {
            InitializeComponent();
        }
        bool FindWindowByTitle(IntPtr hwnd, WindowFinderInfo winName)
        {
            StringBuilder str = new StringBuilder(200);
            GetWindowText(hwnd, str, 200);
            if (!str.ToString().Contains(winName.Name))
                return true;
            winName.Handle = hwnd;
            return false;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr hwin = new IntPtr();
            hwin = Process.GetCurrentProcess().MainWindowHandle;
            var info = new WindowFinderInfo() { Name = "button1" };
            EnumChildWindows(hwin, new EnumWindowProc(FindWindowByTitle), info);
            MessageBox.Show(info.Handle == null ? "Пустой хєндл" : info.Handle.ToString());
        }
    }
    public class WindowFinderInfo
    {
        public string Name;
        public IntPtr? Handle;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5
Похожие ответы