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

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

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

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Diagnostics;
  7. using System.Threading;
  8. using System.Runtime.InteropServices;
  9. using System.Windows.Forms;
  10.  
  11. namespace FindWindowByTitle
  12. {
  13. public partial class Form1 : Form
  14. {
  15. [DllImport("USER32.DLL")]
  16. private static extern int GetWindowText(IntPtr IntPtr, StringBuilder lpString, int nMaxCount);
  17. [DllImport("user32.dll")]
  18. [return: MarshalAs(UnmanagedType.Bool)]
  19. static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, string winName);
  20. public delegate bool EnumWindowProc(IntPtr hWnd, string winName);
  21. public Form1()
  22. {
  23. InitializeComponent();
  24. }
  25. bool FindWindowByTitle(IntPtr hwnd, string winName)
  26. {
  27. StringBuilder str = new StringBuilder(200);
  28. GetWindowText(hwnd, str, 200);
  29. if (!str.ToString().Contains(winName))
  30. return true;
  31. return false;
  32. }
  33. private void Form1_Click(object sender, EventArgs e)
  34. {
  35. Process p= Process.GetProcessesByName("impacthost")[0];
  36. IntPtr hwin = new IntPtr();
  37. hwin = p.MainWindowHandle;
  38. EnumChildWindows(hwin, new EnumWindowProc(FindWindowByTitle), "Gq_MvWorkspace");
  39. }
  40. }
  41. }
Функция

FindWindowByTitle

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

FindWindowByTitle

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

hwin

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

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

textual
Листинг программы
  1. using System;
  2. using System.Text;
  3. using System.Windows.Forms;
  4. using System.Diagnostics;
  5. using System.Runtime.InteropServices;
  6.  
  7. namespace WindowsFormsApplication107
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         [DllImport("USER32.DLL")]
  12.         private static extern int GetWindowText(IntPtr IntPtr, StringBuilder lpString, int nMaxCount);
  13.  
  14.         [DllImport("user32.dll")]
  15.         [return: MarshalAs(UnmanagedType.Bool)]
  16.         static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowProc lpEnumFunc, WindowFinderInfo winName);
  17.         public delegate bool EnumWindowProc(IntPtr hWnd, WindowFinderInfo winName);
  18.         public Form1()
  19.         {
  20.             InitializeComponent();
  21.         }
  22.         bool FindWindowByTitle(IntPtr hwnd, WindowFinderInfo winName)
  23.         {
  24.             StringBuilder str = new StringBuilder(200);
  25.             GetWindowText(hwnd, str, 200);
  26.             if (!str.ToString().Contains(winName.Name))
  27.                 return true;
  28.             winName.Handle = hwnd;
  29.             return false;
  30.         }
  31.  
  32.         private void button1_Click(object sender, EventArgs e)
  33.         {
  34.             IntPtr hwin = new IntPtr();
  35.             hwin = Process.GetCurrentProcess().MainWindowHandle;
  36.             var info = new WindowFinderInfo() { Name = "button1" };
  37.             EnumChildWindows(hwin, new EnumWindowProc(FindWindowByTitle), info);
  38.             MessageBox.Show(info.Handle == null ? "Пустой хєндл" : info.Handle.ToString());
  39.         }
  40.     }
  41.     public class WindowFinderInfo
  42.     {
  43.         public string Name;
  44.         public IntPtr? Handle;
  45.     }
  46. }

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


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

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

6   голосов , оценка 4.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы