Как однозначно определить формы окон? - PullRequest
1 голос
/ 11 января 2010

Мое приложение должно идентифицировать каждую форму каждого открытого приложения. Например, если я нажимаю «Ctrl + f1», когда нахожусь в каком-либо приложении (скажем, в Microsoft Outlook), и если я нахожусь в форме «нового сообщения», мне нужно отправить сообщение в мое приложение со следующей информацией: Процесс = outlook.exe form = "новое сообщение" id формы? (или что-то однозначно идентифицирует форму? это возможно?

Другими словами, идентифицируются ли формы окон однозначно?

О, и оконные дескрипторы не являются решением, потому что они меняются каждый раз, мне нужно что-то, что идентифицирует форму и не меняется, если я закрываю приложение и снова открываю его.

Ответы [ 5 ]

4 голосов
/ 11 января 2010

Windows имеет уникальный HWND.

Этот поток говорит о том, как получить информацию для текущего активного окна.

Вы можете сделать что-то подобноеи затем получите заголовок окна.

3 голосов
/ 11 января 2010

Помните, что окна в других приложениях, особенно в Outlook, редко бывают формами Windows Forms. Вам нужно много P / Invoke, чтобы сделать эту работу. Первое, что вам нужно, это SetWindowsHookEx (), чтобы установить хук WH_KEYBOARD_LL, чтобы вы могли обнаружить нажатие клавиши. Это хорошо гуглится.

Далее вам нужен GetForegroundWindow (), который возвращает вам дескриптор окна с фокусом.

Далее вам нужен GetWindowThreadProcessId (), который позволяет вам узнать идентификатор процесса, которому принадлежит окно. Затем вы можете использовать Process.GetProcessById (), чтобы получить объект Process для программы. Там много информации, свойство Name говорит вам, что это Outlook.exe

Информацию о самом окне получить сложнее. Не так много, но вы можете использовать GetWindowText (), чтобы получить текст, отображаемый на панели заголовков. Если это вообще полезно, вы можете использовать EnumChildWindows для перечисления дочерних элементов управления в окне.

Посетите pinvoke.net для получения необходимых деклараций P / Invoke.

1 голос
/ 28 июня 2010

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

Формы Windows НЕ могут быть однозначно идентифицированы.

1 голос
/ 11 января 2010

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

Вы можете использовать дескриптор окна - однако он будет отличаться на тех же «типах» окон и действителен только при наличии окна.

Ваша идея похожа на какую-то запись в журнале - и дескрипторы регистрации не очень разумны для ИМО.

1 голос
/ 11 января 2010

Каждое окно имеет дескриптор окна . Это уникальное значение типа int32. Это значение используется Win32 API для идентификации окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...