C# 当我更改屏幕上的活动窗口时,是否有任何事件或方法可检测?
我的意思是,例如,我现在正在观看VisualStudio窗口,然后单击Chrome图标的底部,现在我在Chrome窗口中 我希望它检测到我现在所在的窗口已更改。如果我单击了chrome图标或visual studio图标,则不会这样做,而是检测到我现在正在观看/活动/使用的窗口发生了变化 例如,此代码: 在我的表格1的顶部,我添加了:C# 当我更改屏幕上的活动窗口时,是否有任何事件或方法可检测?,c#,winforms,C#,Winforms,我的意思是,例如,我现在正在观看VisualStudio窗口,然后单击Chrome图标的底部,现在我在Chrome窗口中 我希望它检测到我现在所在的窗口已更改。如果我单击了chrome图标或visual studio图标,则不会这样做,而是检测到我现在正在观看/活动/使用的窗口发生了变化 例如,此代码: 在我的表格1的顶部,我添加了: public delegate void ActiveWindowChangedHandler(object sender, String windowHeade
public delegate void ActiveWindowChangedHandler(object sender, String windowHeader, IntPtr hwnd);
public event ActiveWindowChangedHandler ActiveWindowChanged;
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,
IntPtr hwnd, int idObject, int idChild, uint dwEventThread,
uint dwmsEventTime);
const uint WINEVENT_OUTOFCONTEXT = 0;
const uint EVENT_SYSTEM_FOREGROUND = 3;
[DllImport("user32.dll")]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax,
IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc,
uint idProcess, uint idThread, uint dwFlags);
IntPtr m_hhook;
private WinEventDelegate _winEventProc;
然后在构造函数中:
_winEventProc = new WinEventDelegate(WinEventProc);
m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _winEventProc,
0, 0, WINEVENT_OUTOFCONTEXT);
然后添加了事件和函数:
void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd,
int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
if (eventType == EVENT_SYSTEM_FOREGROUND)
{
if (ActiveWindowChanged != null)
ActiveWindowChanged(this,GetActiveWindowTitle(hwnd),hwnd);
}
}
private string GetActiveWindowTitle(IntPtr hwnd)
{
StringBuilder Buff = new StringBuilder(500);
GetWindowText(hwnd, Buff, Buff.Capacity);
return Buff.ToString();
}
~Form1()
{
UnhookWinEvent(m_hhook);
}
但我不确定如何让它工作,如何使用它,以及它是否是正确的代码
你能给我看一个代码示例吗?是的,你可以使用SetWinEventHook函数
hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND ,
EVENT_SYSTEM_FOREGROUND , NULL,
WinEventProcCallback, 0, 0,
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
.......
VOID CALLBACK WinEventProcCallback ( HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
/* your code here */
}
引用的DReJ来自。可能的副本。还有可能是费边的翻版我编辑了我的问题。你能给我举个例子说明如何做和使用它吗?如果你只是引用另一个答案,这应该是一个评论。