SetWindowsHookEx
을 사용하여 시간 추적기 창 캡션 추적에 추가하려고하지만 부분적으로 만 작동합니다.WPF 응용 프로그램의 컨트롤에 포커스가있을 때 활성 창 제목을 캡처하지 못했습니다.
public class Hooks
{
#region DllImport
delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);
private const uint WINEVENT_SKIPOWNPROCESS = 2;
private const uint WINEVENT_SKIPOWNTHREAD = 1;
private const uint WINEVENT_OUTOFCONTEXT = 0;
private const uint EVENT_SYSTEM_FOREGROUND = 3;
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
#endregion DllImport
public static event EventHandler<EventArgs<string>> WindowActivated;
public void Bind()
{
var listener = new WinEventDelegate(EventCallback);
var result = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
EVENT_SYSTEM_FOREGROUND,
IntPtr.Zero,
listener,
0,
0,
(WINEVENT_OUTOFCONTEXT));
}
private static void EventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd,
int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
System.Diagnostics.Debug.Write("EventCallback enter!");
if (eventType == EVENT_SYSTEM_FOREGROUND)
{
var buffer = new StringBuilder(300);
var handle = GetForegroundWindow();
System.Diagnostics.Debug.Write(string.Format("EventCallback GetWindowText: {0}, '{1}'",
GetWindowText(handle, buffer, 300),
buffer));
if (GetWindowText(handle, buffer, 300) > 0 && WindowActivated != null)
{
System.Diagnostics.Debug.Write(string.Format(
"Calling handlers for WindowActivated with buffer='{0}'",
buffer));
WindowActivated(handle, new EventArgs<string>(buffer.ToString()));
}
}
System.Diagnostics.Debug.Write("EventCallback leave!");
}
}
내가 하나의 Textbox
와 메인 UI를 WPF 응용 프로그램이 내가 텍스트 상자의 내용에 후크의 이벤트를 바인딩 : 여기 풀어서 이벤트로 가입자를 제공하기 위해 사용하여 내 코드입니다. 그것을 실행할 때까지 잘 작동합니다. 나는. WPF 창의 texbox를 클릭하면 활성 훅이 약 30-40 초 동안 작동을 멈 춥니 다. 그 후에 이벤트 캡쳐가 작동하지만 메인 WPF 창이 활성화 될 때까지 다시 캡처됩니다.
어떤 아이디어입니까? 어떻게 수정합니까?
자신 만의 WPF 응용 프로그램을 추적해야합니까? 그렇지 않다면'WINEVENT_SKIPOWNPROCESS'를'SetWinEventHook' 호출에 전달하거나 콜백 함수가받은'hwnd'를 자신의 윈도우 핸들과 비교함으로써 필터를 걸러 낼 수는 없습니다. –
@Steven Rands 필자는 사용자가 지정한 플래그로 테스트했습니다. 그것은 아무것도 바뀌지 않았습니다. –
플래그를 어떻게 설정하고 있습니까? 다음과 같이 그들을 전달해야합니다 :'WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS'. 나는 WPF 애플 리케이션을 시험해 보았고, 애플 리케이션 자체가 전경 윈도우가 될 때'EventCallback' 메소드가 호출되는 것을 막았다. –