我目前正在开发一个程序,该程序使用的功能应该在其他进程的窗口最大化/最大化时提醒我.对于最大化事件,我的意思是按下右上角关闭按钮旁边的符号.
为此,我使用SetWinEventHook函数.问题是我无法找到正确的事件代码来捕获此事件.我尝试了EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, EVENT_SYSTEM_MINIMIZESTART and EVENT_SYSTEM_MINIMIZEEND常量,但它们似乎都没有触发最大化事件.但是我可以跟踪其他事件,因此我的SetWinEventHook实现正在运行.
maby有没有想过如何从其他进程捕获最大化事件?
提前致谢.
亲切的问候,鲍勃
代码示例:
// To catch the event
SetWinEventHook(EVENT_MIN, EVENT_MAX, IntPtr.Zero, new WinEventDelegate(WinEventProc), GetProcess(), 0, 0);
// The handler
private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
// TODO: Filter maximize event here
if (eventType == ?)
{
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
在SetWinEventHook()的回调中,处理EVENT_OBJECT_LOCATIONCHANGE事件并通过调用GetWindowPlacement()函数并将showCmd其第二个参数的属性与SW_SHOWMAXIMIZED常量进行比较来检查窗口是否处于最大化状态。
C++ 示例:
void CALLBACK exampleHook(HWINEVENTHOOK hook, DWORD event, HWND hWnd,
LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
if (EVENT_OBJECT_LOCATIONCHANGE == event) {
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
if (SW_SHOWMAXIMIZED == wp.showCmd) {
// Window is maximized.
}
}
}
Run Code Online (Sandbox Code Playgroud)
Fwiw,我在ExplorerHiDpiFix实用程序中使用了这种方法。
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |