以GetCursorPos做樣本,它返回當前滑鼠指標在螢幕的位置(以一個POINT結構體)。
關於GetCursorPos和POINT的定義可以參考MSDN:
http://msdn.microsoft.com/en-us/library/ms648390(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/dd162805(v=vs.85).aspx
首先實現用自訂C#結構體來調用GetCursorPos,一切看著很簡單。
定義一個記憶體分別連續的結構體POINT,然後在平台叫用生命上用out參數,因為GetCursorPos需要一個POINT的指標!在執行上,首先聲明一個POINT變數(這裡涉及到空間的分配),然後調用GetCursorPos,最後輸出結構,正確!
static void Main()
{
POINT p;
GetCursorPos(out p);
Console.WriteLine(p);
}
[StructLayout(LayoutKind.Sequential)]
struct POINT
{
public int X, Y;
public override string ToString()
{
return String.Format("({0},{1})", X, Y);
}
}
[DllImport("user32.dll")]
static extern void GetCursorPos(out POINT p);
接下來看看用一個POINT類(而不是結構體)來實現上面的功能。首先在平台叫用的生命上不需要用out參數,因為類是參考型別,本身就是指標!
其次很重要的是必須使用OutAttribute特性表明POINT參數,因為預設是InAttribute的(如果沒有ref/out的話)。
最後就是空間上的分配,參考型別需要用new來分配。
設定好上面的一切,就可以成功調用了。代碼:
static void Main()
{
POINT p = new POINT();
GetCursorPos(p);
Console.WriteLine(p);
}
[StructLayout(LayoutKind.Sequential)]
class POINT
{
public int X, Y;
public override string ToString()
{
return String.Format("({0},{1})", X, Y);
}
}
[DllImport("user32.dll")]
static extern void GetCursorPos([Out]POINT p);
最後注意StructLayout特性也可以修飾類的!