【问题标题】:SetWinEventHook Window Maximized eventSetWinEventHook 窗口最大化事件
【发布时间】:2018-11-10 00:18:45
【问题描述】:

我目前正在开发一个程序,该程序使用的功能应该在其他进程的窗口最大化/最大化时提醒我。对于最大化事件,我的意思是按下右上角关闭按钮旁边的符号。

为此,我使用了SetWinEventHook 函数。问题是我找不到正确的事件代码来捕捉这个事件。我尝试了EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, EVENT_SYSTEM_MINIMIZESTART and EVENT_SYSTEM_MINIMIZEEND 常量,但它们似乎都没有触发最大化事件。但是,我可以跟踪其他事件,因此我的 SetWinEventHook 实现正在运行。

有没有人知道如何从其他进程中捕获最大化事件?

提前致谢。

带着友好的问候, 鲍勃

代码示例:

// 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
    }   
}

【问题讨论】:

  • `SetWindowsHookEx' 有什么用?
  • 您可以等待调整大小事件,然后检查它是否填满整个屏幕?
  • 必须有更好的方法,但 CBT 钩子可以解决这个问题。
  • 谢谢克里斯,我会调查的!
  • @chris 看看什么?有什么更好的方法!?

标签: c# c++ events


【解决方案1】:

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.
        }
    }
}

Fwiw,我在 ExplorerHiDpiFix 实用程序中使用了这种方法。

【讨论】:

    【解决方案2】:

    Windows 不会触发最大化事件。还有其他方法,但它们非常讨厌,我不会推荐它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2010-09-23
      相关资源
      最近更新 更多