Вопросы по оконным ручкам - PullRequest
0 голосов
/ 12 марта 2010

lang: c # .net 2.0

У меня есть Приложение X, которое вызывает SubWindows 1, 2 и 3.

Я выскакиваю MessageBox, когда открыты 1, 2 или 3.

Моя идея - таймер, который срабатывает каждые 3 секунды и проверяет, открыты ли окна.

а как найти 3 точных окна? Могу ли я использовать Window-Handle-Spy-Application и Hardcode Window-Handles в моем коде, чтобы найти их когда-либо? Или изменить дескриптор окна, когда приложение X открывается новым?

1 Ответ

1 голос
/ 12 марта 2010

Я собираюсь ответить с точки зрения Win32, потому что я более знаком с Win32, чем .Net Framework, и вы можете найти соответствующие функции в .Net Framework или использовать P / Invoke для вызова этих функций Win32.

Я предполагаю, что вы знаете следующее:

  • Идентификатор процесса приложения X.
  • Имя (или текст) или Windows 1, 2, 3, и что эти окна имеют уникально идентифицируемый текст.

Если вы не знаете идентификатор процесса, вам нужно перечислить процессы и сравнить имя каждого процесса с приложением X, и когда вы получите совпадение, тогда вы знаете идентификатор процесса.

Чтобы найти три окна, первое, что нам нужно сделать, это найти окна верхнего уровня с идентификатором процесса. Одним из них будет предок подокон.

Перечислить все окна, используя EnumWindows (); Во время перечисления запишите все окна (их может быть несколько), в которых есть искомый идентификатор процесса.

Имея список окон, соответствующий идентификатору процесса, вам необходимо проверить все потомки каждого окна в этом списке. Вы можете сделать это с помощью EnumChildWindows (); Убедитесь, что вы делаете все дочерние окна дочерних окон и т. Д., Пока их больше нет. Таким образом, вы будете закрывать все окна в процессе. Для каждого найденного вами окна сравните его с известным текстом подокнов, которые вы ищете. Когда вы получаете магазин спичек, который где-то находится в HWND, вы можете его использовать.

Теперь, когда у вас есть HWND, я предполагаю, что вы можете превратить их в .Net используемые элементы управления Windows.

Я сделал быстрый поиск, похоже, что EnumWindows не является частью .Net Framework, поэтому вам придется использовать P / Invoke для этой работы. Возможно, вам будет проще написать вспомогательную функцию на C / C ++, которая выполняет весь поиск и просто передает HWND в массиве - таким образом, вам нужно вызвать только одну функцию через P / Invoke и всю работу для этого. поиск может быть выполнен в C / C ++, где непосредственный вызов Win32 будет более простым.

...