2011-02-02 2 views
1

Я хочу использовать Mono, чтобы разрешить мою программу на C# (в настоящее время WPF, но изменит ее на Windows Forms или Silverlight, чтобы Mono работал), который в настоящее время работает в Windows, чтобы работать на Mac.Мышь Нажмите в Mac OS и определите, какое приложение для ОС работает в

Я использую родные окна кода для обнаружения при щелчке мыши, а также щелкнуть мышью, например, так:

[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 Apple Carbon или Cocoa API и выяснить, как делать то, что вы хотите, а затем P/Invoke the API. FWIW, я не знаю, можно ли управлять мышью с помощью общедоступного API. Там, кажется, есть некоторые сайты вокруг, которые объясняют, как сделать some of this stuff.

Для начала получить нужную позицию мышки можно с помощью HIGetMousePosition (Carbon) или [NSEvent mouseLocation] (Cocoa). Хотя многие высокоуровневые API-интерфейсы Carbon устарели, они по-прежнему составляют ядро ​​низкоуровневого API C, используемого Cocoa. Может быть сложно понять, как читать события Carbon и извлекать из них информацию, OTOH Cocoa означает взаимодействие с Objective-C, что более сложно, чем P/Invoke, но MonoMac имеет некоторые API, которые могут сделать это проще.