Trying to determine if mouse clicked inside window region - autohotkey

I have a simple Autohotkey script that I want to use to determine if the mouse was clicked inside a window. I want the function to fail if the click was on the title bar or on the scroll bars of the window. My script looks like this:
LButton::
WinGetPos, X, Y, Width, Height, A
MouseGetPos, x,y
Rightmargin := Width - 50
Topmargin := Y+25
if (x < Rightmargin and y > Topmargin)
MsgBox You're Inside
return
The problem is when I run this, it freezes up my machine. All the left mouse clicks are captured and do not get through to the system and for some reason the test case always fails (I never see the MsgBox).
Can you tell me what I am doing wrong?

Variables, Labelnames and so on are case-insensitive in AutoHotkey. So, with WinGetPos, X, Y and MouseGetPos, x,y, you are allocating these two variables twice, overwriting the window's position coordinates. So, for example, you might want to rename x to mouseX and y to mouseY.
Since you obviously want your mouse coordinates being measured by the current window, you should also include coordmode, mouse, relative before your hotkey assignments.
Finally, if you also want your Click to be send to the window, includ a tilde ~ before your Hotkey: ~LButton::.

Related

Use WinMove to move relative to location, instead of absolut destination

Is it possible to move a window by for example 200 pixles downwards, or similar?
I have only found the WinMove command, but it requires an fixed location, instead of just moving the window a bit downwards for example.
So if I wanted to move the calc downwards a bit in the below example, how would I go about doing that?
Run, calc.exe
WinWait, Calculator
WinMove, xxxx?
Thanks!
What you need in this case, is the WinGetPos command.
Example:
; Press F1 to move the Calculator window 10 pixel downwards:
F1::
If !WinExist("Calculator") ; "!" means "NOT" in this case
Run, calc.exe
WinWait, Calculator
WinGetPos, X, Y, Width, Height, Calculator
WinMove, Calculator, , X, Y+10
return

Moving the mouse pointer to the cursor

Is there an autohotkey function which brings the mouse pointer to the active cursor?
(assume that the active window has a active cursor, e.g., in notepad, etc.)
MouseMove, A_CaretX, A_CaretY, 0
A_CaretX and A_CaretY are the current X and Y coordinates of the caret (text insertion point). The coordinates are relative to the active window unless CoordMode is used to make them relative to the entire screen. If there is no active window or the caret position cannot be determined, these variables are blank.
https://www.autohotkey.com/docs/Variables.htm#misc

Trigger AHK script based on the position of the mouse

Is it possible to trigger an AHK script based on the position of the mouse? Say, if I wanted to press a button or series of buttons on my keyboard if I move my mouse to the corner or edge of the screen. Also, can this be done multiple times per second until the mouse is moved out of the specified area?
All I could find from googling is AHK scripts for moving the mouse using the keyboard, when I want to do the opposite.
I did it, thanks Aaron and ahkcoder.
I got a little better feel with Up and Down instead of PgUp and PgDn, to anyone else, play with the timings until it's sufficient. You'll also need to modify the values for the edges of your screen.
; move up and down when mouse is at edges of screen
#Persistent
SetTimer, foo, 65
return
foo:
MouseGetPos, x, y, id, control
; ToolTip, %x% %y%
; will trigger only at edges of a full screen
if (y = 1087){
; bottom
send {Down}
send {Down}
send {Down}
; sleep, 300
}
else if(y = 8){
; top
send {Up}
send {Up}
send {Up}
}
return
Yes. Easiest way I can think of to do what you are asking is to use SetTimer and MouseGetPos to evaluate the position and if it matches than trigger your script.
The 2nd example code on the MouseGetPos is using SetTimer. This should get you headed in the right direction.

How to click 2 screen regions at once and how to click without moving pointer in autohotkey

So how to click 2 screen regions at the same time or very fast one after another by using a single hotkey. The intent is to cover clicking on an object that can appear in 2 random areas of the screen by using a single key.
As an example I have tried using
a::click 735, 626 send, 750, 204 send, but it creates a loop for a few seconds, where the mouse is unresponsive and hovers in those areas, and using 2 separate hotkeys takes more time than i would wish.
I would also like to know if it is possible to issue a click command via a hotkey but not move the mouse pointer at all. I would like to set a hotkey that pressed will issue a left click command on a determined area of the screen but not move the mouse pointer in order to do so.
You definitely need to take a look at the help docs or FAQ again as well as some other examples to understand basic syntax. It is only one command per line. Here is an example of code that will get you going.
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0 ; Sets default mouse speed to maximum
a::
MouseGetPos, X, Y ; Stores current mouse position
Click 735, 626
Click 735, 500
MouseMove, % X, % Y ; Moves mouse back to original position
Return
For the second question about issuing a click command without using the pointer, I suggest you look at the ControlClick documentation here: http://www.autohotkey.com/docs/commands/ControlClick.htm

GTK/GDK How to find out if a window is overlayed by another one?

I've got a gtk application which features a tray icon, if the user clicks on the icon the visibility of the window is toggled when he's on the same workspace as the window is. When he's on another workspace the window moves to that one.
Now, if the application and user are on the same screen and the app is completely overlayed by another one, I want to raise the window so it's on the top, instead of first hiding it and the on the next tray icon click showing it again.
My code so far:
def inOverlayed(self):
windows = self.window.get_screen().get_toplevel_windows()
win = self.window.get_window()
x, y, w, h, b = win.get_geometry()
for i in windows:
if win != i:
x2, y2, w2, h2, b2 = i.get_geometry()
if x >= x2 and x + w <= x2 + w2:
if y >= y2 and y + h <= y2 + h2:
return True
return False
The biggest problem is seems that there is no way to determine a windows z-level, but without one can't distinguish if the window is just inside another one or if it's acutally overlayed by one.
So my question is, how do I find out a windows z-level(the docs don't say anything about this) or is there a simpler solution for this problem
You can't, since the z-level is completely at the discretion of the window manager. GDK can send hints to the window manager about raising or lowering the window in the stack, but the window manager is free to ignore them.
A good substitute for what you want might be to check gtk.Window.is_active(); if true, hide the window, otherwise call gtk.Window.present() on it. This shows the window, de-iconifies it, and moves it to the current desktop all at once.