我必須實現保存窗口最後位置的功能。當應用程序啓動時,需要獲取並恢復此位置。如何在.NET c#中使用Win32 GetMonitorInfo()?
現在可能是第二臺顯示器被拆除。如果最後一個位置在現在不可見的監視器上(換句話說,保存的座標在可見座標之外),則應該捕獲這種情況,並將座標設置爲默認位置而不是最後位置。
爲了檢索關於顯示器的信息,我需要使用Win32。我做這件事並不容易。
我創建了一個助手類:
public static class DisplayHelper
{
private const int MONITOR_DEFAULTTONEAREST = 2;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetSystemMetrics(int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern UInt32 MonitorFromPoint(Point pt, UInt32 dwFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern bool GetMonitorInfo(UInt32 monitorHandle, ref MonitorInfo mInfo);
public static void GetMonitorInfoNow(MonitorInfo mi, Point pt)
{
UInt32 mh = MonitorFromPoint(pt, 0);
mi.cbSize = (UInt32)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MonitorInfo));
mi.dwFlags = 0;
bool result = GetMonitorInfo(mh, ref mi);
}
}
而這些是我嘗試創建monitorInfo的和矩形類:
[StructLayout(LayoutKind.Sequential)]
public class MonitorInfo
{
public UInt32 cbSize;
public Rectangle2 rcMonitor;
public Rectangle2 rcWork;
public UInt32 dwFlags;
public MonitorInfo()
{
rcMonitor = new Rectangle2();
rcWork = new Rectangle2();
cbSize = (UInt32)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MonitorInfo));
dwFlags = 0;
}
}
[StructLayout(LayoutKind.Sequential)]
public class Rectangle2
{
public UInt64 left;
public UInt64 top;
public UInt64 right;
public UInt64 bottom;
public Rectangle2()
{
left = 0;
top = 0;
right = 0;
bottom = 0;
}
}
我使用這個代碼,這樣獲得的可視監控:
//80 means it counts only visible display monitors.
int lcdNr = DisplayHelper.GetSystemMetrics(80);
var point = new System.Drawing.Point((int) workSpaceWindow.Left, (int) workSpaceWindow.Top);
MonitorInfo monitorInfo = new MonitorInfo();
DisplayHelper.GetMonitorInfoNow(monitorInfo, point);
最後一個方法在嘗試執行時會引發異常
bool result = GetMonitorInfo(mh, ref mi);
任何建議,我需要做什麼來解決這個問題?
感謝Gabe,我忘記提及我的應用程序是用WPF編寫的。理論上,我將無法訪問System.Windows.Forms.Screen,除非它也適用於WPF? – Houman 2011-06-08 13:41:22
@Kave:只需添加一個對System.Windows.Forms.dll的引用,就可以在WPF中使用它。 – Gabe 2011-06-08 13:43:39
@Gabe - 這可能會更容易,但我不確定是否會爲任何優化加載一個類/方法的5MB程序集。更不用說它的依賴關係;-) – CodeNaked 2011-06-08 13:55:12