2011-02-02 31 views
1

我想使用Mono來允許我的C#程序(目前是WPF,但會將其更改爲Windows窗體或Silverlight,以便Mono可以工作)在Mac上工作。鼠標在Mac OS中點擊並檢測哪個OS應用程序正在運行

我使用本機Windows代碼來檢測被點擊鼠標時,也以點擊鼠標,就像這樣:

[DllImport("user32.dll")] 
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 
[DllImport("User32.dll")] 
public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); 

爲了使這個在Mac上工作,我必須首先能夠檢測程序是在Mac上還是在Windows中運行,然後運行適當的代碼來檢測是否單擊鼠標或單擊鼠標。喜歡的東西:

if (runningInWindows()) 
{ 
    // Windows mouse click... 
    System.Windows.Forms.Cursor.Position = new System.Drawing.Point(X, Y); 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

    // Or if I want to detect a mouse click... 
    bool mouseClicked = GetAsyncKeyState(System.Windows.Forms.Keys.LButton) != 0; 
} 
else 
{ 
    // Running on a Mac, so do Mac mouse click... 
    // Or detect a mouse click on a Mac... 
} 

基本上我有3個問題:

  1. 你怎麼點擊Mac上的鼠標? (相當於mouse_event)
  2. 如何在Mac上檢測到鼠標點擊? (相當於GetAsyncKeyState)
  3. 如何檢測應用程序在哪個操作系統中運行?

回答

3

檢測操作系統很簡單,你可以找到一些平臺檢測代碼here

其他兩個更難。你必須看看蘋果公司的原生碳或可可API,並找出如何做你想做的事情,然後P /調用這些API。 FWIW,我不知道是否可以用公共API控制鼠標。似乎有一些網站解釋如何做some of this stuff

首先,通過HIGetMousePosition(Carbon)或[NSEvent mouseLocation](Cocoa)獲得鼠標位置似乎是可能的。雖然許多高級Carbon API已被棄用,但它仍然是Cocoa使用的低級C API的核心。搞清楚如何閱讀Carbon事件並從中提取信息可能非常棘手,OTOH Cocoa意味着與Objective-C進行互操作,這比P/Invoke更復雜 - 但MonoMac有一些API可以使它更容易。