Windows 当一个窗口移动到另一个监视器时是否有通知?

Windows 当一个窗口移动到另一个监视器时是否有通知?,windows,winapi,window,Windows,Winapi,Window,我有一个窗口,在V-Sync关闭的情况下由IDXGISwapChain1刷新。如果可能,我想手动控制窗口的当前速率,使其尽可能接近当前监视器刷新速率 在两个刷新率不同的监视器连接到PC的情况下,我希望在窗口从一个监视器移动到另一个监视器时收到通知,以便相应地更改当前帧速率 据我所知,WM\u DISPLAYCHANGE和WM\u DPICHANGED可能不包括这种情况。如果我错了,请纠正我 更新: 这是我的代码基于Street的答案 LRESULT OnPositionChanged(UINT

我有一个窗口,在V-Sync关闭的情况下由
IDXGISwapChain1
刷新。如果可能,我想手动控制窗口的当前速率,使其尽可能接近当前监视器刷新速率

在两个刷新率不同的监视器连接到PC的情况下,我希望在窗口从一个监视器移动到另一个监视器时收到通知,以便相应地更改当前帧速率

据我所知,
WM\u DISPLAYCHANGE
WM\u DPICHANGED
可能不包括这种情况。如果我错了,请纠正我

更新: 这是我的代码基于Street的答案

LRESULT OnPositionChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    // Get the monitor handle for the window. 
    HMONITOR currentMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
    // error handling

    // no need to bother if the window stays on the same monitor
    if (_currentMonitor != currentMonitor)
    {
        // Get more information about the monitor
        MONITORINFOEX monitorInfo;
        monitorInfo.cbSize = sizeof(MONITORINFOEX);
        BOOL succeed = GetMonitorInfo(currentMonitor, (LPMONITORINFO)&monitorInfo);
        // error handling

        // Get the current display settings for that monitor, which includes the refresh rate
        DEVMODE devMode;
        devMode.dmSize = sizeof(DEVMODE);
        succeed = EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
        // error handling

        // use devMode.dmDisplayFrequency to update my present frame rate
        // ...

        _currentMonitor = currentMonitor;
    }

    return 0L;
}

LRESULT OnDisplayChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    // WM_DISPLAYCHANGE message is sent to all windows when the display resolution has changed
    // When a WM_DISPLAYCHANGE message is sent, any monitor may be removed from the desktop and thus its HMONITOR becomes invalid or has its settings changed.

    _currentMonitor = NULL;

    return 0L;
}

我想在窗口更改其位置后更改帧速率,因此我切换到
WM\u WINDOWPOSCHANGED

在窗口位置更改后,您可以检查消息

发送到窗口,其大小、位置或在Z顺序中的位置为 由于调用SetWindowPos函数或 另一个窗口管理功能

然后通过调用函数获取当前监视器的刷新赫兹。如果刷新频率更改,请更改应用程序的刷新频率

dmDisplayFrequency:指定频率,单位为赫兹(每个周期) 第二),在特定模式下显示设备的。此值为 也称为显示设备的垂直刷新率。展示 驱动程序使用此成员。例如,它用于 更改显示设置功能。打印机驱动程序不使用此选项 成员

注意:您可以设置一个变量来保存上一显示的刷新频率,然后将该变量与当前显示的频率进行比较。如果不同,则表示Hz发生了变化

如果需要确定窗口打开的监视器,可以使用该功能

下面是一个代码示例: