Haga clic en el mouse en Mac OS y detectar en qué aplicación del sistema operativo se está ejecutando

StackOverflow https://stackoverflow.com/questions/4877295

  •  28-10-2019
  •  | 
  •  

Pregunta

Quiero usar Mono para permitir mi programa C# (actualmente WPF, pero lo cambiaré a formularios de Windows o Silverlight para que Mono funcione) que actualmente funciona en Windows para funcionar en una Mac.

Utilizo el código de Windows nativo para detectar cuándo se hace clic en un mouse, y también para hacer clic en el mouse, como así:

[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);

Para que esto funcione en una Mac, primero debo poder detectar si el programa se está ejecutando en una Mac o en Windows, y luego ejecutar el código apropiado para detectar si se hace clic en un mouse o para hacer clic en el mouse. Algo como:

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...
}

Esencialmente tengo 3 preguntas:

  1. ¿Cómo se hace clic en el mouse en una Mac? (equivalente de mouse_event)
  2. ¿Cómo se detecta un clic del mouse en una Mac? (equivalente de getAsynckeyState)
  3. ¿Cómo se detecta en qué sistema operativo se ejecuta su aplicación?
¿Fue útil?

Solución

Detectar el sistema operativo es fácil, puede encontrar algún código de detección de plataforma aquí.

Los otros dos son más difíciles. Tendría que mirar las API nativas de carbono o cacao de Apple y descubrir cómo hacer las cosas que desea, luego P/Invok esas API. FWIW, no sé si es posible controlar el mouse con API pública. Parece que hay algunos sitios que explican cómo hacer algunas de estas cosas.

Para empezar, obtener la posición del mouse parece ser posible a través de HIGetMousePosition (Carbono) o [NSEvent mouseLocation] (Cacao). Aunque muchas API de carbono de alto nivel están en desuso, todavía forma el núcleo de la API C de bajo nivel utilizada por el cacao. Podría ser complicado descubrir cómo leer los eventos de carbono y extraer información de ellos, OTOH Cocoa significa interopta con Objective -C, que es más complicado que P/Invoke, pero Monomac tiene algunas API que pueden facilitar eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top