【问题标题】:Equivalent of user32.dll on OS X相当于 OS X 上的 user32.dll
【发布时间】:2009-08-21 23:37:08
【问题描述】:

我正在编写一个库,它使用 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 包装器也是一种选择?

【问题讨论】:

  • Window 模型完全不同——你不能为此使用纯 Mono 调用吗?否则,您将不得不查看其中一个 Cocoa/Mono 库

标签: c# winapi macos mono


【解决方案1】:

来自the Mono website

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

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

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

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

查看pinvoke,一个结果是GetForegroundWindow 引用mwinapi - 乍一看,这看起来不便携,因此您可能无法找到托管解决方案。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2014-03-27
      • 2011-06-02
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多