OS X上的user32.dll等效

时间:2009-08-21 23:37:09

标签: c# winapi macos mono

我正在编写一个使用windows user32.dll库中的一些函数的库,但我正在使用Mono编译它以查看它在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包装器也是一个选项吗?

2 个答案:

答案 0 :(得分:5)

来自the Mono website

  

如果您正在调用平台提供的内容(通常是win32 API),则必须找到在所有目标平台上完成相同功能的方法。这可能意味着用托管等效项替换您的非托管调用,或者它可能意味着检测您正在运行的平台并调用Win32 / * nix / OSX /等。等效。

     

http://pinvoke.net有时可以帮助您找到与Win32 API调用相对应的托管。)

     

如果您要调用自己的本机库,那么它取决于库的跨平台功能。如果您的本机库可以在所有目标平台上运行,那么您的应用程序应该没问题。如果没有,您可以使本机库跨平台兼容,在托管代码中执行操作,或通过检测您正在运行的平台来解决此问题。

他们还会链接到Interop with Native Libraries上的页面。

通过pinvoke查看,结果是GetForegroundWindow引用mwinapi - 乍一看,这看起来并不便携,因此您可能会因为找不到托管而烦恼溶液

答案 1 :(得分:1)

可能没有直接映射。在OS X中,存在多个环境Cocoa / Carbon / Java / X11,并且每个环境都有自己的API。 Cocoa和Java是面向对象的API,而Carbon和X11是基于函数的。 Apple建议将Cocoa用于新应用程序。您必须实例化Cocoa对象并通过函数调用封装访问。