Winapi 在Windows 7上保存和恢复Aero捕捉位置

Winapi 在Windows 7上保存和恢复Aero捕捉位置,winapi,windows-7,aero-snap,Winapi,Windows 7,Aero Snap,假设我有一个窗口,我想在窗口关闭时保存它的位置,并在窗口再次打开时恢复它。执行此操作的典型方法是调用GetWindowPlacement/SetWindowPlacement。这需要记住位置和最大化/最小化状态 在Windows 7上,您可以使用该功能将窗口停靠在屏幕一侧。我的问题是如何保存和恢复已“快照”的窗口,以便恢复“快照”状态。据我所知,GetWindowPlacement/SetWindowPlacement并不能解决这个问题,而且我还没有在Windows7中看到任何“快照”API 这

假设我有一个窗口,我想在窗口关闭时保存它的位置,并在窗口再次打开时恢复它。执行此操作的典型方法是调用GetWindowPlacement/SetWindowPlacement。这需要记住位置和最大化/最小化状态

在Windows 7上,您可以使用该功能将窗口停靠在屏幕一侧。我的问题是如何保存和恢复已“快照”的窗口,以便恢复“快照”状态。据我所知,GetWindowPlacement/SetWindowPlacement并不能解决这个问题,而且我还没有在Windows7中看到任何“快照”API

这里有一个类似的问题
但在这种情况下,OP似乎只是想要恢复位置,而不是“捕捉”状态。

解决方法是调用
GetWindowRect()
,以获取实际窗口坐标,并将它们复制到
WINDOWPLACEMENT::rcNormalPosition

中的错误坐标上,我解决方法是覆盖CWinAppEx::SaveState,要在保存前更新WINDOWPLACEMENT,请执行以下操作:

BOOL MyApp:SaveState(LPCTSTR lpszSectionName, CFrameImpl *pFrameImpl)
{
  WINDOWPLACEMENT wp;
  wp.length = sizeof(WINDOWPLACEMENT);
  m_pMainWnd->GetWindowPlacement(&wp);
  if (wp.showCmd == SW_SHOWNORMAL)
  {
    m_pMainWnd->GetWindowRect(&wp.rcNormalPosition);
    m_pMainWnd->SetWindowPlacement(&wp);
  }

  return __super::SaveState(lpszSectionName, pFrameImpl);
}

不,没有暴露。存储工作区大小也是一种解决方法。最近有人改变过视频分辨率吗?我不知道有什么方法可以保存快照状态,让windows在再次拖动时恢复“正常”状态。请注意,快照没有最大化。@Hans Passant,存储工作区大小的问题是,即使在那时,我也无法知道窗口被快照(我可以从rcNormal!=windowPos的事实中推断出来)@Deanna,这也是我得出的结论,我看不到任何方法可以让窗口进入“快照”状态,当你把它从边缘拖下来时,它会恢复,我很惊讶他们没有暴露出来,哦,好吧!要添加的一点是,如果showCmd是SW_NORMAL,则只应在WINDOWPLACEMENT::rcNormalPosition上写入。例如,如果窗口最大化,如果将最大化的窗口大小存储为正常大小,则无法轻松将窗口恢复到正常位置。
if(SW_normal==wp.showCmd)GetWindowRect(&wp.rcNormalPosition)
问题在于
GetWindowRect
使用屏幕坐标,而GetWindowPlacement使用工作区坐标。