Mouse position

From Rosetta Code
Revision as of 08:28, 28 May 2011 by 91.19.254.44 (talk)
Task
Mouse position
You are encouraged to solve this task according to the task description, using any language you may know.

Get the current location of the mouse cursor relative to the active window. Please specify if the window may be externally created.

Ada

Library: GTK version GtkAda
Library: GtkAda
Library: GLib

The GTK procedure is Get_Pointer. It returns mouse coordinates relatively to a window (internally created). The following program shows a button, which when pressed indicates coordinates of the mouse pointer relatively to the main window: <lang Ada>with GLib; use GLib; with Gtk.Button; use Gtk.Button; with Gtk.Label; use Gtk.Label; with Gtk.Window; use Gtk.Window; with Gtk.Widget; use Gtk.Widget; with Gtk.Table; use Gtk.Table;

with Gtk.Handlers; with Gtk.Main;

procedure Tell_Mouse is

  Window : Gtk_Window;
  Grid   : Gtk_Table;
  Button : Gtk_Button;
  Label  : Gtk_Label;

  package Handlers is new Gtk.Handlers.Callback (Gtk_Widget_Record);
  package Return_Handlers is
     new Gtk.Handlers.Return_Callback (Gtk_Widget_Record, Boolean);

  function Delete_Event (Widget : access Gtk_Widget_Record'Class)
     return Boolean is
  begin
     return False;
  end Delete_Event;

  procedure Destroy (Widget : access Gtk_Widget_Record'Class) is
  begin
     Gtk.Main.Main_Quit;
  end Destroy;

  procedure Clicked (Widget : access Gtk_Widget_Record'Class) is
     X, Y : GInt;
  begin
     Get_Pointer (Window, X, Y);
     Set_Text (Label, "At" & GInt'Image (X) & GInt'Image (Y));
  end Clicked;

begin

  Gtk.Main.Init;
  Gtk.Window.Gtk_New (Window);
  Gtk_New (Grid, 1, 2, False);
  Add (Window, Grid);
  Gtk_New (Label);
  Attach (Grid, Label, 0, 1, 0, 1);
  Gtk_New (Button, "Click me");
  Attach (Grid, Button, 0, 1, 1, 2);
  Return_Handlers.Connect
  (  Window,
     "delete_event",
     Return_Handlers.To_Marshaller (Delete_Event'Access)
  );
  Handlers.Connect
  (  Window,
     "destroy",
     Handlers.To_Marshaller (Destroy'Access)
  );
  Handlers.Connect
  (  Button,
     "clicked",
     Handlers.To_Marshaller (Clicked'Access)
  );
  Show_All (Grid);
  Show (Window);

  Gtk.Main.Main;

end Tell_Mouse;</lang>

AutoHotkey

Window may be an externally created window. <lang AutoHotkey>#i:: ; (Optional) Assigns a hotkey to display window info, Windows+i MouseGetPos, x, y ; Gets x/y pos relative to active window WinGetActiveTitle, WinTitle ; Gets active window title Traytip, Mouse position, x: %x%`ny: %y%`rWindow: %WinTitle%, 4 ; Displays the info as a Traytip for 4 seconds return</lang>

BBC BASIC

The mouse coordinates are relative to the bottom-left corner of the BBC BASIC main output window: <lang bbcbasic> MOUSE xmouse%, ymouse%, buttons%

     PRINT xmouse%, ymouse%</lang>

C

Library: Xlib

<lang c>#include <stdio.h>

  1. include <X11/Xlib.h>

int main() {

 Display *d;
 Window inwin;      /* root window the pointer is in */
 Window inchildwin; /* child win the pointer is in */
 int rootx, rooty; /* relative to the "root" window; we are not interested in these,
                      but we can't pass NULL */
 int childx, childy;  /* the values we are interested in */
 Atom atom_type_prop; /* not interested */
 int actual_format;   /* should be 32 after the call */
 unsigned int mask;   /* status of the buttons */
 unsigned long n_items, bytes_after_ret;
 Window *props; /* since we are interested just in the first value, which is

a Window id */

 /* default DISPLAY */
 d = XOpenDisplay(NULL); 
 /* ask for active window (no error check); the client must be freedesktop
    compliant */
 (void)XGetWindowProperty(d, DefaultRootWindow(d),

XInternAtom(d, "_NET_ACTIVE_WINDOW", True), 0, 1, False, AnyPropertyType, &atom_type_prop, &actual_format, &n_items, &bytes_after_ret, (unsigned char**)&props);

 XQueryPointer(d, props[0], &inwin,  &inchildwin,

&rootx, &rooty, &childx, &childy, &mask);

 printf("relative to active window: %d,%d\n", childx, childy);
 XFree(props);           /* free mem */
 (void)XCloseDisplay(d); /* and close the display */
 return 0;

}</lang>

c_sharp

Writes the absolute Mouse Position of the Screen into the Console <lang csharp> using System; using System.Windows.Forms; static class Program {

   [STAThread]
   static void Main()
   {
       Console.WriteLine(Control.MousePosition.X);
       Console.WriteLine(Control.MousePosition.Y);
   }

} </lang>

Clojure

<lang lisp>(let [point (.. java.awt.MouseInfo getPointerInfo getLocation)] [(.getX point) (.getY point)])</lang>

Delphi

Shows Mouse Position on a label on the form

<lang Delphi>procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

 Y: Integer);

begin

  lblMousePosition.Caption := ('X:' + IntToStr(X) + ', Y:' + IntToStr(Y));

end;</lang>


Delphi Console Program

The following program will help capture mouse position with the help of Windows and classes units.

<lang Delphi>program Project1; {$APPTYPE CONSOLE} uses

 SysUtils, Controls, Windows;

var

 MyMouse : TMouse;

begin

 MyMouse := TMouse.Create;
 While True do
 begin
   WriteLn('(X, y) = (' + inttostr(TPoint(MyMouse.CursorPos).x) + ',' + inttostr(TPoint(MyMouse.CursorPos).y) + ')');
   sleep(300);
 end

end.</lang>

--Neo.abhinav 17:00, 6 May 2011 (UTC)

F#

Have to do a lot of interop here. Primarily because the active window may not be a .NET form/control. If the question was for the point relative to the current window, life would be much simpler. <lang fsharp>open System.Windows.Forms open System.Runtime.InteropServices

  1. nowarn "9"

[<Struct; StructLayout(LayoutKind.Sequential)>] type POINT =

   new (x, y) = { X = x; Y = y }
   val X : int
   val Y : int

[<DllImport("user32.dll")>] extern nativeint GetForegroundWindow(); [<DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)>] extern int ScreenToClient(nativeint hWnd, POINT &pt);

let GetMousePosition() =

   let hwnd = GetForegroundWindow()
   let pt = Cursor.Position
   let mutable ptFs = new POINT(pt.X, pt.Y)
   ScreenToClient(hwnd, &ptFs) |> ignore
   ptFs

</lang>

Gambas

In gambas, the position of the pointer can only be determined when the click button is held down. A window with a drawing area is required, because this is the only widget that can track pointer movement within gambas.

<lang gambas> PUBLIC SUB Form1_MouseMove() PRINT mouse.X PRINT Mouse.Y END </lang>

HicEst

Mouse click positions for windows created internally. X and Y are in units of current xy axes (optional: invisible). <lang hicest> WINDOW(WINdowhandle=handle)

  AXIS(WINdowhandle=handle, MouSeCall=Mouse_Callback, MouSeX=X, MouSeY=Y) 
END

SUBROUTINE Mouse_Callback()

  WRITE(Messagebox, Name) X, Y
END</lang>

Icon and Unicon

In Icon/Unicon the mouse position may be tracked between button presses for any window created by the program. The following code snippet taken from the Icon Graphics Book on page 197-198 shows how to track the mouse. <lang Icon>until *Pending() > 0 & Event() == "q" do { # loop until there is something to do

  px := WAttrib("pointerx")
  py := WAttrib("pointery")
  #  do whatever is needed
  WDelay(5)  # wait and share processor

</lang>


Java

Works with: Java version 1.5+

The mouse position can be checked at any time by calling <lang java5>Point mouseLocation = MouseInfo.getPointerInfo().getLocation();</lang> This returns a point on the entire screen, rather than relative to a particular window. This call can be combined with getLocation() from any Component (including a Frame, which is a window) to get the location relative to that Component.

JavaScript

One of many ways to add an event listener:

<lang javascript>document.onmousemove = function(ev) {

 var mouse = {x: ev.clientX, y: ev.clientY};

}</lang>

In the above example, the window may not be external. It must in fact be a web browser window, which runs the script.

Liberty BASIC

This example gets the mouse position based on the active window. Click on other windows to get relative mouse position based on those windows. <lang lb> nomainwin

   UpperLeftX = DisplayWidth-WindowWidth
   UpperLeftY = DisplayHeight-WindowHeight
   struct point, x as long, y as long
   stylebits #main.st ,0,0,_WS_EX_STATICEDGE,0
   statictext #main.st "",16,16,100,26
   stylebits #main ,0,0,_WS_EX_TOPMOST,0
   open "move your mouse" for window_nf as #main
   #main "trapclose [quit]"
   timer 100, [mm]
   wait

[mm]

   CallDll #user32, "GetForegroundWindow", WndHandle as uLong
   #main.st CursorPos$(WndHandle)
   wait

[quit]

   close #main
   end

function CursorPos$(handle)

   Calldll #user32, "GetCursorPos",_
       point as struct,_
       result as long
   Calldll #user32, "ScreenToClient",_
       handle As Ulong,_
       point As struct,_
       result as long
   x = point.x.struct
   y = point.y.struct
   CursorPos$=x; ",";y

end function</lang>

<lang logo>show mousepos  ; [-250 250]</lang>

Mathematica

<lang Mathematica>MousePosition["WindowAbsolute"]</lang>

MATLAB

<lang MATLAB>get(0,'PointerLocation')</lang>

OCaml

equivalent to the C example, uses the Xlib binding ocaml-xlib <lang OCaml>open Xlib

let () =

 let d = xOpenDisplay "" in
 (* ask for active window (no error check);
    the client must be freedesktop compliant *)
 let _, _, _, _, props =
   xGetWindowProperty_window d
       (xDefaultRootWindow d)
       (xInternAtom d "_NET_ACTIVE_WINDOW" true)
       0 1 false AnyPropertyType
 in
 let _, _, _, child, _ = xQueryPointer d props in
 begin match child with
 | Some(_, childx, childy) ->
     Printf.printf "relative to active window: %d,%d\n%!" childx childy;
 | None ->
     print_endline "the pointer is not on the same screen as the specified window"
 end;
 xCloseDisplay d;
</lang>


Oz

Repeatedly shows the mouse coordinates relative to the foremost window of the application. <lang oz>declare

 [QTk] = {Module.link ['x-oz://system/wp/QTk.ozf']}
 WindowClosed = {NewCell false}
 Label
 Window = {QTk.build

td(action:proc {$} WindowClosed := true {Window close} end label(text:"" handle:Label))} in

 {Window show}
 for while:{Not @WindowClosed} do
    TopmostWindow = {List.last {String.tokens {Tk.return wm(stackorder '.')} & }}
    Winfo = {Record.mapInd winfo(rootx:_ rooty:_ pointerx:_ pointery:_)

fun {$ I _} {Tk.returnInt winfo(I TopmostWindow)} end}

 in
    {Label set(text:"x: "#(Winfo.pointerx - Winfo.rootx)

#", y: "#(Winfo.pointery - Winfo.rooty))}

    {Delay 250}
 end</lang>

PicoLisp

The following works in an XTerm window. After calling (mousePosition), click into the current terminal window. The returned value is (X . Y), where X is the column and Y the line number. <lang PicoLisp>(de mousePosition ()

  (prog2
     (prin "^[[?9h")  # Mouse reporting on
     (and
        (= "^[" (key))
        (key 200)
        (key 200)
        (key)
        (cons
           (- (char (key)) 32)
           (- (char (key)) 32) ) )
     (prin "^[[?9l") ) )  # Mouse reporting off</lang>

Output:

: (mousePosition)
-> (7 . 3)

PureBasic

The mouse position can be obtained by these two commands. <lang PureBasic>x = WindowMouseX(#MyWindow) y = WindowMouseY(#MyWindow)</lang> This example repeatedly shows the mouse coordinates relative to the window created in the application. <lang PureBasic>#MyWindow = 0

  1. Label_txt = 0
  2. MousePos_txt = 1

If OpenWindow(#MyWindow,0,0,200,200,"Test",#PB_Window_SystemMenu)

 TextGadget(#Label_txt,0,0,100,20,"Mouse Position (x,y):",#PB_Text_Right)
 TextGadget(#MousePos_txt,120,0,60,20,"()")
 
 Repeat 
   Repeat
     event = WaitWindowEvent(10)
     If event = #PB_Event_CloseWindow
       Break 2 ;exit program
     EndIf 
   Until event = 0
   
   x = WindowMouseX(#MyWindow)
   y = WindowMouseY(#MyWindow)
   SetGadgetText(#MousePos_txt,"(" + Str(x) + "," + Str(y) + ")")
 ForEver

EndIf</lang>

Python

Mouse position using Tkinter graphics library nearly universally included in installations of Python. There is other alternatives but they are platform specific. Shows position of mouse while it is over the program windows and changes color of window when mouse is near (<10) hot spot 100,100.

Code is based on post in Daniweb: http://www.daniweb.com/forums/post616327.html#post616327 by ZZucker <lang python> import Tkinter as tk

def showxy(event):

   xm, ym = event.x, event.y
   str1 = "mouse at x=%d  y=%d" % (xm, ym)
   # show cordinates in title
   root.title(str1)
   # switch color to red if mouse enters a set location range
   x,y, delta = 100, 100, 10
   frame.config(bg='red'
                if abs(xm - x) < delta and abs(ym - y) < delta
                else 'yellow')

root = tk.Tk() frame = tk.Frame(root, bg= 'yellow', width=300, height=200) frame.bind("<Motion>", showxy) frame.pack()

root.mainloop() </lang>

<lang python>

  1. simple way of ,get cursor xy data
  2. niwantha33@gmail.com

from Tkinter import * win=Tk() win.geometry("200x300") def xy(event):

   xm, ym = event.x, event.y
   xy_data = "x=%d  y=%d" % (xm, ym)
   lab=Label(win,text=xy_data)
   lab.grid(row=0,column=0)

win.bind("<Motion>",xy) mainloop() </lang>

Retro

This requires running Retro on a VM with support for the canvas device.

<lang Retro>needs canvas' ^canvas'mouse</lang>

Ruby

Library: Shoes

<lang Ruby> Shoes.app(:title => "Mouse Position", :width => 400, :height => 400) do

 @position = para "Position : ?,?", :size => 12, :margin => 10
 
 motion do |x,y|
   @position.text = "Position : " + x.to_s + "," + y.to_s 
 end

end </lang>

Tcl

Library: Tk

<lang tcl>package require Tk 8.5 set curWindow [lindex [wm stackorder .] end]

  1. Everything below will work with anything from Tk 8.0 onwards

set x [expr {[winfo pointerx .] - [winfo rootx $curWindow]}] set y [expr {[winfo pointery .] - [winfo rooty $curWindow]}] tk_messageBox -message "the mouse is at ($x,$y) in window $curWindow"</lang>

Visual Basic

There are two methods for determining where the mouse pointer is. The first only works when the pointer is actually over the window containing the code. This actually works for any control that has a MouseMove event, but it doesn't work if the pointer is over anything else, including controls on the form (so if the pointer is over a button on the current form, the event will only fire for the button, not the form). <lang vb>Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

   'X and Y are in "twips" -- 15 twips per pixel
   Me.Print "X:" & X
   Me.Print "Y:" & Y

End Sub</lang>

The second method uses the Windows API, and can be easily translated to any language that can make API calls. This example uses a Timer control to check the mouse position. <lang vb>Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI

   'X and Y are in pixels, with (0,0) being the top left corner of the primary display
   X As Long
   Y As Long

End Type

Private Pt As POINTAPI

Private Sub Timer1_Timer()

   GetCursorPos Pt
   Me.Cls
   Me.Print "X:" & Pt.X
   Me.Print "Y:" & Pt.Y

End Sub</lang>