簡體   English   中英

用戶更改活動流程時觸發事件

[英]Fire event when user changes active process

當程序用戶將活動窗口更改為其他進程的窗口時,是否會觸發事件或創建事件的方法?

如果沒有這樣的事件,那么制作類似的東西的最佳方法是什么?

我目前正在使用一個計時器,該計時器每3秒運行一次Process.GetCurrentProcess(),但是我正在尋找一種更好,更高效的方法,並且由於降低了制作程序的風險,我不想縮短間隔時間占用太多資源,或者花費太多時間不斷檢查活動進程。

我知道有很多Windows內置函數基本上是隱藏的,我沒有足夠的知識知道,所以如果任何人對這樣的事情有任何想法,那么如果您能幫助我,那將是很好的。

SetWinEventHook API正是您在這里尋找的功能。 您需要做的就是在應用程序使用正確的選項啟動時調用此方法,並且只要用戶從桌面上當前運行的任何進程更改焦點時,都應該開始接收通知。

[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, uint dwflags);
[DllImport("user32.dll")]
internal static extern int UnhookWinEvent(IntPtr hWinEventHook);
internal delegate void WinEventProc(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int      idObject, int idChild, int dwEventThread, int dwmsEventTime);

const uint WINEVENT_OUTOFCONTEXT = 0;
const uint EVENT_SYSTEM_FOREGROUND = 3;
private IntPtr winHook;
private WinEventProc listener;

public void StartListeningForWindowChanges()
{
    listener = new WinEventProc(EventCallback);
    //setting the window hook
    winHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, listener, 0, 0, WINEVENT_OUTOFCONTEXT);
}

public void StopListeningForWindowChanges()
{
    UnhookWinEvent(winHook);
}

private static void EventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime)
{
    // handle active window changed!
}

我想說的一種方法是采用Windows掛鈎,即CBT掛鈎。 聽起來更接近“舊的” Win32 API和通用C / C ++人員。 就我所知,同時還有C#版本http://msdn.microsoft.com/en-us/magazine/cc188966.aspx#S5

因此,想法是每次獲得HCBT_ACTIVATE類型的掛鈎事件(要激活的窗口)時檢查當前進程,然后檢查擁有該窗口的進程。 如果它與以前記住的過程不匹配-是時候觸發您的事件了。 唯一要記住的是,您自己的操作也可能觸發CBT鈎子(您必須避免無盡的自我推動循環!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM