SELF-SOLVED AutoHotkey Function GetMouseTaskbutton need to adapt for 64-bit OS
- by auntyEEK
SOLVED VIA SELF-HELP, HAIR-PULLING, AND TEETH-GRINDING.
THANKS ANYWAY.......
I'm using the GetMouseTaskbutton function from this thread on AHK forum.
[http://www.autohotkey.com/forum/topic22763.html&highlight=getmousetaskbutton][1]
; Gets the index+1 of the taskbar button which the mouse is hovering over.
; Returns an empty string if the mouse is not over the taskbar's task toolbar.
;
; Some code and inspiration from Sean's TaskButton.ahk
GetMouseTaskButton(ByRef hwnd)
{
MouseGetPos, x, y, win, ctl, 2
; Check if hovering over taskbar.
WinGetClass, cl, ahk_id %win%
if (cl != "Shell_TrayWnd")
return
; Check if hovering over a Toolbar.
WinGetClass, cl, ahk_id %ctl%
if (cl != "ToolbarWindow32")
return
; Check if hovering over task-switching buttons (specific toolbar).
hParent := DllCall("GetParent", "Uint", ctl)
WinGetClass, cl, ahk_id %hParent%
if (cl != "MSTaskSwWClass")
return
WinGet, pidTaskbar, PID, ahk_class Shell_TrayWnd
hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pRB := DllCall("VirtualAllocEx", "Uint", hProc
, "Uint", 0, "Uint", 20, "Uint", 0x1000, "Uint", 0x4)
VarSetCapacity(pt, 8, 0)
NumPut(x, pt, 0, "int")
NumPut(y, pt, 4, "int")
; Convert screen coords to toolbar-client-area coords.
DllCall("ScreenToClient", "uint", ctl, "uint", &pt)
; Write POINT into explorer.exe.
DllCall("WriteProcessMemory", "uint", hProc, "uint", pRB+0, "uint", &pt, "uint", 8, "uint", 0)
; SendMessage, 0x447,,,, ahk_id %ctl% ; TB_GETHOTITEM
SendMessage, 0x445, 0, pRB,, ahk_id %ctl% ; TB_HITTEST
btn_index := ErrorLevel
; Convert btn_index to a signed int, since result may be -1 if no 'hot' item.
if btn_index 0x7FFFFFFF
btn_index := -(~btn_index) - 1
if (btn_index > -1)
{
; Get button info.
SendMessage, 0x417, btn_index, pRB,, ahk_id %ctl% ; TB_GETBUTTON
VarSetCapacity(btn, 20)
DllCall("ReadProcessMemory", "Uint", hProc
, "Uint", pRB, "Uint", &btn, "Uint", 20, "Uint", 0)
state := NumGet(btn, 8, "UChar") ; fsState
pdata := NumGet(btn, 12, "UInt") ; dwData
ret := DllCall("ReadProcessMemory", "Uint", hProc
, "Uint", pdata, "UintP", hwnd, "Uint", 4, "Uint", 0)
} else
hwnd = 0
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pRB, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
; Negative values indicate seperator items. (abs(btn_index) is the index)
return btn_index > -1 ? btn_index+1 : 0
}
It identifies the owner of the hovered taskbar button.
I'm using it in a routine to auto-activate window by hovering its taskbar button, and also a routine to close inactive window by middle-click on its taskbar button.
Works great on my XP machine.
The author had stated that the function does work in Vista, but it refuses to work for me in Vista 64-bit, so apparently it is only valid in 32-bit. And I am very new to AHK, and don't know how to adapt it.
Unfortunately, my queries at the site sank without a trace.
Does anyone have advice for me? I will be most grateful.
Thanks.