2 votes

Ruby - Obtenir les coordonnées de la souris

Comment obtenir la position du pointeur de la souris en ruby ?

Cela devrait être la position absolue (écran).

Si cela nécessite une réponse spécifique au système, je suis sur Ubuntu.

Merci

9voto

tessi Points 5724

J'ai assemblé la fonction suivante. Elle effectue une répartition en fonction du système d'exploitation et suit une stratégie différente pour chaque SE :

require 'rbconfig'

##
# Retourne un tableau [x, y] contenant les coordonnées de la souris
# Notez que le système de coordonnées dépend du SE.
def getMouseLocation
  def windows
    require "Win32API"
    getCursorPos = Win32API.new("user32", "GetCursorPos", 'P', 'L')
    # point est une structure Long, Long
    point = "\0" * 8
    if getCursorPos.Call(point)
      point.unpack('LL')
    else
      [nil, nil]
    end
  end

  def linux
    loc_string = `xdotool getmouselocation --shell`[/X=(\d+)\nY=(\d+)/]
    loc_string.lines.map { |s| s[/.=(\d+)/, 1].to_i }
  end

  def osx
    # si nous exécutons RubyCocoa, nous pouvons accéder aux bibliothèques objective-c
    require "osx/cocoa"
    OSX::NSEvent.mouseLocation.to_a
  rescue LoadError
    # nous n'exécutons pas ruby cocoa, mais il devrait être préinstallé sur chaque système
    coords = `/usr/bin/ruby -e 'require "osx/cocoa"; puts OSX::NSEvent.mouseLocation.to_a'`
    coords.lines.map { |s| s.to_f }
  end

  case RbConfig::CONFIG['host_os']
  when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
    windows
  when /darwin|mac os/
    osx
  when /linux|solaris|bsd/
    linux
  else
    raise Error, "système d'exploitation inconnu : #{host_os.inspect}"
  end
rescue Exception => e
  [nil, nil]
end

Testé sur Ubuntu 13.04 (gnome-shell), Windows 7 64bit, OS x 10.8.4. Je serais ravi si quelqu'un pouvait confirmer que cela fonctionne sur d'autres systèmes. Une solution jruby manque également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X