1

現在Windowsで動作しているC#プログラム(現在はWPFですが、Monoが動作するようにWindowsフォームまたはSilverlightに変更します)をMacで動作させるためにMonoを使用したいと思います。

ネイティブの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. アプリケーションが実行されているオペレーティングシステムをどのように検出しますか?
4

1 に答える 1

3

オペレーティングシステムの検出は簡単です。プラットフォーム検出コードはここにあります

他の2つは難しいです。AppleのネイティブCarbonまたはCocoaAPIを調べて、必要なことを実行する方法を理解してから、それらのAPIをP/Invokeする必要があります。FWIW、パブリックAPIでマウスを制御できるかどうかはわかりません。このようなことのいくつかを行う方法を説明するいくつかのサイトが周りにあるようです

HIGetMousePositionまず、 (Carbon)または[NSEvent mouseLocation](Cocoa)を使用してマウスの位置を取得できるようです。多くの高レベルのCarbonAPIは非推奨ですが、Cocoaで使用される低レベルのCAPIのコアを形成しています。Carbonイベントを読み取り、そこから情報を抽出する方法を理解するのは難しいかもしれません。OTOHCocoaは、P / Invokeよりも複雑なObjective-Cとの相互運用を意味しますが、MonoMacにはそれを簡単にするAPIがいくつかあります。

于 2011-02-02T23:34:39.413 に答える