ウィンドウの位置を保存するときにはGetWindowPlacementを使って通常のウィンドウの位置を取得しているのですが、この関数はワークエリア相対で位置を返します。そこで、SystemParametersInfoにSPI_GETWORKAREAを指定してワークエリアを取得して位置をずらしているのですが、このメソッドはプライマリモニタのワークエリアを返してくるので、セカンダリモニタにウィンドウがあるとやっぱりずれてしまいます。そこで、MonitorFromWindowで取得したモニタに対して、GetMonitorInfoしてワークエリアを取得するようにしました。
ウィンドウが複数のモニタにまたがっている場合に、GetWindowPlacementがどのモニタのワークエリアを基点にするのかが良くわからないので、そのような場合にはおかしくなるかもしれませんが、そもそもそんな使い方はしないと思われるので気にしてもしょうがなさそうです。