2013-03-08 2 views
1

Мне нужен базовый процесс для сбора информации о других приложениях, используемых Windows. Я подозреваю, что это будет сделано с помощью WAPI-перехватчиков. Что я хочу сделать, так это то, что моя программа обнаруживает, когда окна меняют фокус из одной программы в другую и рассказывают, в какой из них в настоящее время есть фокус.Обнаружить изменение фокуса и найти его C#

Для начала мне нужно событие, которое запускает каждый раз, когда Windows меняет фокус между двумя приложениями. Все события, которые я нашел до сих пор, обрабатывают только изменения, внесенные в программу или ее использование, но мне нужно найти все фокус-изменения, даже если это между двумя другими программами.

Мне также нужна функция, которая дает мне окно в фокусе. Будет this работать, или это только внутренне (окна в текущем приложении, а не другие программы)?

Приветствия

+0

Вы имеете в виду что-то вроде этого [Detect активное окно изменено с помощью C# без опроса] (http://stackoverflow.com/a/10280800/884561) ? –

ответ

2

В зависимости от того, насколько точно вы нужны вашей системы обнаружения изменения фокуса, чтобы быть вы могли бы уйти с сервисом, что опросы для переднего плана окна с помощью функции API вы описали GetForegroundWindow (да это является общесистемной, а не специфичной для процесса).

Затем вы можете использовать дескриптор этой функции, чтобы определить, какой процесс является текущим активным/сфокусированным процессом. Затем получить сфокусированный элемент (дочернее окно) этот процесс ..

HWND hwnd = GetForegroundWindow(); 
DWORD remoteThreadId = GetWindowThreadProcessId(hwnd, NULL); 
DWORD currentThreadId = GetCurrentThreadId(); 
AttachThreadInput(rThreadId, curThreadId, TRUE); 
HWND focusElement = GetFocus(); 
AttachThreadInput(rThreadId, curThreadId, FALSE); 

Продолжай делать это .. и делать то, что вам нужно сделать с focusElement

UPDATE

Ну, по-видимому, как @Kenneth K., размещенное в комментарии, есть глобальное событие, которое можно подключить, чтобы приложение было уведомлено при изменении окна с фокусом (сфокусированным). Таким образом, вам не нужно постоянно зацикливаться на этих изменениях.

EVENT_SYSTEM_FOREGROUND = 3; 
WINEVENT_OUTOFCONTEXT = 0; 

Вы можете следить за example in this answer, чтобы увидеть, как подключить это событие и получить уведомление. Затем всякий раз, когда меняется окно переднего плана (сфокусировано), вы можете перехватывать контур сообщения этого окна и просматривать изменения фокуса формы с помощью этого окна с помощью функции SetWindowsHookEx.

Другие варианты, чтобы проконсультироваться с list of system events on MSDN и посмотреть, если есть один вы можете использовать вместо EVENT_SYSTEM_FOREGROUND, или вместе с ним, чтобы обнаружить фокус событий контроля уровня. Возможно, полезно использовать EVENT_OBJECT_FOCUS.

Пожалуйста, дайте мне знать, если это до сих пор неясно ..

+0

Действительно, я могу зацикливать его достаточно часто, чтобы заставить его работать, но я бы хотел более высокую точность, чем это было возможно. Существуют ли какие-либо глобальные события Windows, которые срабатывают при изменении фокуса между двумя приложениями? – Fredrik

+0

@Fredrik - см. Обновление ответа. –

Смежные вопросы