對於我正在創建的應用程序,我想攔截來自外部進程的窗口消息(很像spy ++的做法)。我想通了,我可以使用SetWinEventHook來做到這一點。 這是我的代碼。C#SetWinEventHook失敗(返回0)
class Program
{
internal delegate void WinEventProc(IntPtr hWinEventHook, int iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime);
[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr SetWinEventHook(int eventMin, int eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, SetWinEventHookFlags dwflags);
//[DllImport("user32.dll", SetLastError = true)]
internal static extern int UnhookWinEvent(IntPtr hWinEventHook);
internal enum SetWinEventHookFlags
{
WINEVENT_INCONTEXT = 4,
WINEVENT_OUTOFCONTEXT = 0,
WINEVENT_SKIPOWNPROCESS = 2,
WINEVENT_SKIPOWNTHREAD = 1
}
static void Main(string[] args)
{
int threadId = 0x000306D4;
int processId = 0x000306BC;
WinEventProc listener = new WinEventProc(EventCallback);
//setting the window hook and writing the result to the console
Console.WriteLine(SetWinEventHook(1, 0x7fffffff, IntPtr.Zero, listener, processId, threadId, SetWinEventHookFlags.WINEVENT_INCONTEXT).ToString());
Console.WriteLine("done");
Console.ReadKey();
}
private static void EventCallback(IntPtr hWinEventHook, int iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime)
{
//callback function, called when message is intercepted
Console.WriteLine(hWnd.ToString());
}
}
}
據我所知,我使用的是正確的P/Invoke的聲明,但是當我運行這段代碼的輸出是:
0 done
如果成功的話,它應該返回一個HWINEVENTHOOK值標識此事件掛接實例。如果不成功,它返回0.(根據微軟的網站至少) 線程和進程似乎是有效的和運行。
任何人都可以幫助我更接近我的問題是什麼?我認爲它一定要麼是小事,要麼我只是用完全錯誤的方法去做我想做的事情。提前致謝。
我發現部分問題,應該是使用SetWinEventHookFlags.WINEVENT_OUTOFCONTEXT代替SetWinEventHookFlags.WINEVENT_INCONTEXT。否則它期望我提供一個dll,它可以在其中找到「上下文」 – NoCode 2012-08-04 19:38:54
,但仍然沒有窗口消息被捕獲 – NoCode 2012-08-04 19:39:15