eamat @Cabinet
MUS.ahk
最終更新:
eamat
-
view
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
/************************************************************************
マウス関数群 (MUS.ahk) グローバル変数 : なし 各関数の依存性 : なし(必要関数だけ切出してコピペでも使えます) AutoHotkey Version: 1.1.24.00 Language: Japanease Platform: Win9x/NT Author: eamat. 2009.01.07 ************************************************************************ 2012.11.09 マルチディスプレイ マイナス座標値対策 2012.11.13 関数名見直し MUS_CheckOnTitleBar → MUS_IsTitleBar MUS_CheckOnTitleBarEX → MUS_GetTitleBarPos 2016.11.18 MS-Officeのタイトルバーに個別対応 2019.04.22 CoordModeの不要処理削除 (def_cmode) */ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 動作確認用 内部ルーチン ; 単体起動時のテスト用なので削除しても問題なし ; ※ Hotkey設定してますが#Include時は AutoexecueSectionは ; 無視されるだけなのでほっといていいです。
_MUS_Autoexecue_Sample:
Hotkey,~Rbutton,_MUS_SampleClickHotkey,~Mbutton,_MUS_SampleTitlebar Hotkey,+ESC,_MUS_SampleExit return _MUS_SampleClick:
;トリプル以上を取りたい場合はタイムアウト値を多めにする必要がありますTooltip, % "MUS_MultiClickCheck()のテスト`nクリック回数:" MUS_MultiClickCheck(A_ThisHotkey,0,800) return _MUS_SampleTitlebar:
_MUS_test()return _MUS_SampleExit:
ExitApp
_MUS_test() {
r1 := MUS_IsTitleBar(0)r2 := MUS_IsTitleBar(1) r3 := MUS_GetTitleBarPos(h3,0) r4 := MUS_GetTitleBarPos(h4,1) msg := "---マウスがタイトルバー上にあるかどうか---`n" . "MUS_IsTitleBar(MdiChild=0)`n`n" . "MDI子ウィンドウはみない - > " r1 "`n" . "MDI子ウィンドウもみる - > " r2 "`n`n" . "---マウスがタイトルバー上のどこにあるか---`n" . "MUS_GetTitleBarPos(byref rhWnd, MdiChild=0)`n`n" . "MDI子ウィンドウはみない - > " r3 " " h3 "`n" . "MDI子ウィンドウもみる - > " r4 " " h4 tooltip,%msg% } ;--------------------------------------------------------------------------- ; 汎用関数 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; マウスがタイトルバー上にあるかチェックし、ウィンドウハンドルを返す ; 対象: AHK v1.0.43.06以降 ; in MdiChild 1:MDI子ウィンドウを対象に含める ; 戻り値: ウィンドウハンドル (0:Not Found) ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;MUS_CheckOnTitleBar(MdiChild=0, def_cmode=1) {
MUS_IsTitleBar(MdiChild=0) {
;---
マウス座標値直下のコントロールハンドル取得 ---CoordMode,Mouse,Screen MouseGetPos,sX,sY,hWnd,chWnd,3 ;2007.03.30 sY += (sY < 0) ? 0xFFFF : 0 ;マルチディスプレイ対策 2012.11.09 sX += (sX < 0) ? 0xFFFF : 0 SendMessage,0x84,0,% (sY<<16)|sX,,ahk_id %chWnd% ;WM_NCHITTEST If (ErrorLevel = 0xFFFFFFFF) MouseGetPos,,,,chWnd,2 hWnd := ((MdiChild) && ("" <> chWnd)) ? chWnd : hWnd WinGet, WinStyle, Style, ahk_id %hWnd% ; MS-Office タイトルバー対策 2016.11.18 MouseGetPos, , , ,clsnn,1 hWnd := Instr(clsnn,"NetUIHWND") ? chWnd : hWnd ;--- マウスがタイトルバー上にあるかチェック --- if (WinStyle & 0x00C00000 = 0x00C00000) { ;WS_CAPTION SendMessage,0x84,0,% (sY<<16)|sX,,ahk_id %hWnd% ;WM_NCHITTEST if (ErrorLevel = 2) return hWnd } return 0 ;マウス下:タイトルなし } ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; マウスがタイトルバー上の何処にあるかチェックして返す ; 対象: AHK v1.0.43.06以降 作成 : 2008.11.29 ; ; out rhWnd マウス下ウィンドウハンドル ; in MdiChild 1:MDI子ウィンドウを対象に含める ; ; 戻り値 ; 2 (HTCAPTION) キャプションバー上にある ; 3 (HTSYSMENU) システムメニューアイコン上 ; 8 (HTMINBUTTON) [_] アイコン化ボタン上にある ; 9 (HTMAXBUTTON) [□] 最大化ボタン上にある ; 20 [x] 閉じるボタン上にある ; 21 [?] ヒントボタン上にある ; 0 タイトルバー上でない ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;MUS_CheckOnTitleBarEX(byref rhWnd, MdiChild=0, def_cmode=1) { MUS_GetTitleBarPos(byref
rhWnd, MdiChild=0) {
;---
マウス座標値直下のコントロールハンドル取得 ---CoordMode,Mouse,Screen MouseGetPos,sX,sY,hWnd,chWnd,3 ;2007.03.30 MouseGetPos, , , ,clsnn,1 ;2016.11.18 sY += (sY < 0) ? 0xFFFF : 0 ;マルチディスプレイ対策 2012.11.09 sX += (sX < 0) ? 0xFFFF : 0 SendMessage,0x84,0,% (sY<<16)|sX,,ahk_id %chWnd% ;WM_NCHITTEST cret := ErrorLevel If (ErrorLevel = 0xFFFFFFFF) MouseGetPos,,,,chWnd,2 hWnd := ((MdiChild) && ("" <> chWnd)) ? chWnd : hWnd WinGet, WinStyle, Style, ahk_id %hWnd% ;--- マウスがタイトルバー上にあるかチェック --- if (WinStyle & 0x00C00000 = 0x00C00000) { ;WS_CAPTION rhWnd := hWnd SendMessage,0x84,0,% (sY<<16)|sX,,ahk_id %hWnd% ;WM_NCHITTEST ret := ErrorLevel if RegExMatch(ret, "^(2|3|8|9|20|21)") return ret ; MS-Office タイトルバー対策 2016.11.18 else if Instr(clsnn,"NetUIHWND") && RegExMatch(cret, "^2") return cret } return 0 ;マウス下:タイトルなし } ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; 割と厳密な多重クリックチェック ; 対象: AHK v1.0.34以降 ; in button 対象マウスボタン ; MaxCount チェックする最大クリック回数(0で無制限) ; timout タイムアウト(デフォルト=システムWクリック時間) ; 戻り値 : マウスクリック回数 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MUS_MultiClickCheck(button,MaxCount=2,timout=0) {
button :=
RegExReplace(button,"i)[\+\^!#<>\*~\$]","")
;モデファイヤ削除;1クリック目が発生してないなら即終了 GetKeyState, push, %button%, P ifEqual,push,U, return 0 ;--- タイムアウト時間セット --- timout := (!timout) ? DllCall("User32.dll\GetDoubleClickTime",Int) : timout timout += A_TickCount ;--- ダブルクリック位置許容範囲を取得 --- MouseGetPos, x1 , y1 SysGet,cx,36 ;SM_CXDOUBLECLK SysGet,cy,37 ;SM_CYDOUBLECLK ph = 1 MaxPh := MaxCount*2 -1 Loop { ;--- マウスクリック/解除チェック --- ;奇数フェーズ:クリック解除待ち / 偶数フェーズ:クリック待ち opt := (1 = mod(ph,2)) ? "U" : "D" ;奇数フェーズ: KeyWait, %button%, %opt% T0.01 ph += (!ErrorLevel) ? 1 : 0 if (A_TickCount > timout) || ((0 < MaxCount) && (ph > MaxCount*2-1)) break ;--- マウス移動量チェック --- MouseGetPos, x2 , y2 if ((x1 > x2) && (x1-x2 > cx)) || ((x2 > x1) && (x2-x1 > cx)) || ((y1 > y2) && (y1-y2 > cy)) || ((y2 > y1) && (y2-y1 > cy)) break } return % ph // 2 } ;++++++++++++++++++++++++++++++++++++++++++++++++++++ ; マウス下コントロールのハンドルを取得 ;++++++++++++++++++++++++++++++++++++++++++++++++++++ MUS_GetCtrlHwnd() {
CoordMode,Mouse,ScreenMouseGetPos,x,y,hwnd,ctrl,3 y += (y < 0) ? 0xFFFF : 0 ;マルチディスプレイ対策 2012.11.09 x += (x < 0) ? 0xFFFF : 0 SendMessage,0x84,0,% (y<<16)|x,,ahk_id %ctrl% ;WM_NCHITTEST If (ErrorLevel = 0xFFFFFFFF) ; -1: HTTRANSPARENT MouseGetPos,,,,ctrl,2 return ctrl } |