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_SampleClick
    Hotkey,~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,Screen
    MouseGetPos,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
}
 
記事メニュー
目安箱バナー