2009-08-21 77 views
6

我正在編寫一個庫,它使用windows user32.dll庫中的一些函數,但是我正在用Mono編譯它以查看它如何在OS X上運行。不幸的是,它找不到user32.dll庫的原因很明顯。OS X上的user32.dll相當於

但我的問題是這樣的...有沒有一個類似的圖書館OS X我可以使用?我特別尋找以下功能。

[DllImport("user32.dll")] 
static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll")] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

[DllImport("user32.dll")] 
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 

[DllImport("user32.dll")] 
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

我認爲安裝WINE會有所幫助,但我寧願避免這種情況發生。使用Ruby win32包裝也是一種選擇?

+1

窗口模型是完全不同的 - 你不能使用純粹的單聲道呼叫這個?否則,你將不得不看看其中一個Cocoa/Mono庫 – Mark 2009-08-21 23:48:05

回答

5

the Mono website

如果你撥打的是通過你的平臺(通常在Win32 API)提供的東西,你必須找到一個方法來完成你的所有目標平臺上相同的功能。這可能意味着用一個託管的等價物取代你的非託管呼叫,或者它可能意味着檢測你正在運行的平臺,並調用Win32/* nix/OSX /等。當量。

http://pinvoke.net有時可以幫助您找到管理等同於Win32 API調用)。

如果您呼叫到自己的本地庫,那就要看你的庫的跨平臺能力。如果您的本地庫可以在所有目標平臺上運行,那麼您的應用程序應該沒問題。如果沒有,您可以使您的本地庫跨平臺兼容,在託管代碼中執行操作,或通過檢測您正在運行的平臺來解決它。

而且他們還鏈接到Interop with Native Libraries上的一個頁面。

翻閱pinvoke,其中一個結果是GetForegroundWindow引用mwinapi - 乍看之下,這看起來不方便,因此您可能在尋找託管解決方案時運氣不佳。

1

可能沒有直接映射。在OS X中有幾個環境Cocoa/Carbon/Java/X11,每個環境都有自己的API。 Cocoa和Java是面向對象的API,而Carbon和X11是基於函數的。 Apple建議使用Cocoa作爲新的應用程序。你必須實例化Cocoa對象並通過函數調用封裝訪問。