マニュアル > Tips一覧 > AutoHotKey > パネルを自動的に隠す

「マニュアル/Tips一覧/AutoHotKey/パネルを自動的に隠す」の編集履歴(バックアップ)一覧に戻る

マニュアル/Tips一覧/AutoHotKey/パネルを自動的に隠す - (2010/09/20 (月) 11:34:24) の編集履歴(バックアップ)


  • やや修正 -- 名無し (2010-01-19 01:41:55)
  • やや修正 -- 名無し (2010-01-23 07:06:35)
  • ナビゲータも消せるように。1辺の周辺を反応範囲にできるように。ほかやや修正。 -- 名無し (2010-04-05 09:16:30)
  • 透明度の取得が不安定なのでScript側で管理する方式に変更。 -- 名無し (2010-09-19 10:38:40)
  • ツールバーを消すときに選択色を小窓で出すようにした。PadRectLeave廃止。ハンドル取得廃止。 -- 名無し (2010-09-19 23:55:58)
  • 小窓をSAI準拠の形式に変更。内部整理。 -- 名無し (2010-09-20 07:43:09)
名前:
コメント:

;//////////////////////////////////////////////////////////
; HkSaiパネラー
; 無保証・再配布・改変自由
;
; 動作 AutoHotKey 1.0.48.05
; 推奨 SAI 1.1.0
;
; 使用法
;  まず、SAIのiniをいじって、パネルを独立ウィンドウ表示にしてください。
;  指定したパネルからカーソルが遠ざかるとパネルが隠れます。
;  ひらがなカタカナキーで機能の停止・再開が切り替えできます。
;
;  2010/09/20 小窓をSAI準拠の形式に変更。内部整理。
;  2010/09/19 ツールバーを消すときに選択色を小窓で出すようにした。PadRectLeave廃止。ハンドル取得廃止。
; 2010/09/19 透明度の取得が不安定なのでScript側で管理する方式に変更。
; 2010/04/05 ウィンドウの非表示方法を、透明度を0にする方式に変更。
;  2010/01/23 HIDE/SHOWが遅いので、DLL直に変更。 ホットキー押してる時だけ表示(AllShowRealtime())追加
;  2010/01/10 修正
; 2009/12/26
;  作成
;
;-----------------------------------------------------------
; 設定
;-----------------------------------------------------------
;パネル全体指定の場合
; この数が多いほど、検出範囲は実際のウィンドウサイズより内側になる。
PadLeave:=-30
; この数が多いほど、検出範囲は実際のウィンドウサイズより内側になる。
PadClose:=10
 
;辺指定の場合
; この数が多いほど、検出範囲は実際のウィンドウサイズより内側になる。
;(未使用)PadRectLeave:=-70
; この数が多いほど、検出範囲は実際のウィンドウサイズより内側になる。
PadRectClose:=50
 
;マウスをチェックする間隔(ms)
TimerMiliSec:=50
;色をチェックする間隔(ms)
TimerCheckColMiliSec:=250
 
;消すパネルを選ぶ 0=消さない 1=消す
	;ツールパネルを消す
	SW_TOOL:=	1
	;カラーパネルを消す
	SW_COL:=	1
	;レイヤーパネルを消す
	SW_LAY:=	1
	;ナビゲータを消す
	SW_NAV:=	1
 
;マウスの反応範囲
; ... 0 パネルを中心
; ... 1 ..xx
; ... 2 右辺を中心
; ... 3 ..xx
; ... 4 左辺を中心
	;ツールパレット
	HEN_TOOL:=	0
	;カラーパレット
	HEN_COL:=	0
	;レイヤパレット
	HEN_LAY:=	0
	;ナビゲ
	HEN_NAV:=	0
 
;-----------------------------------------------------------
;設定ここまで
;-----------------------------------------------------------
 
;-----------------------------------------------------------
;初期化
;-----------------------------------------------------------
	;非透過
	VISIBLE:=255
	;透過
	INVISIBLE:=0
 
	;モード
	ForceToShow:=0
 
	;処理部で使いまわす変数
	IsPanelVisible:=1
 
	;透過値管理
	aTOL:=""
	aCOL:=""
	aLAY:=""
	aNAV:=""
 
	;パネル検索用データ
	TA_TOOL:="ツール ahk_class sfl_window_class"
	TA_COL:="カラー ahk_class sfl_window_class"
	TA_LAY:="レイヤー ahk_class sfl_window_class"
	TA_NAV:="ナビゲータ ahk_class sfl_window_class"
 
;-----------------------------------------------------------
;	初期処理
;-----------------------------------------------------------
	#MaxThreads 1
	#MaxThreadsPerHotkey 1
	#SingleInstance IGNORE
 
	#HotkeyInterval 1000		; This is  the default value (milliseconds).
	#MaxHotkeysPerInterval 50	; This is the default value.
 
	;アイコン(任意)
	;Menu, Tray,Icon, panel.ico
	;座標モードをスクリーンに
	CoordMode, Mouse, Screen
 
	;終了時
	OnExit, ExitSub
	;タイマー
	SetTimer, MouseCheck, %TimerMiliSec%
 
;-----------------------------------------------------------
;	GUI初期化
;-----------------------------------------------------------
 
	if (	SW_TOOL=	1){
		;親(外枠)
		pS:=44
		Gui, 7: Margin, 0, 0 
		Gui, 7: -Border +ToolWindow +AlwaysOnTop -Caption -HScroll -VScroll
		GUI, 7: Color, 888888
		;Gui, 7: Show, x640 y480 w%pS% h%pS%
			Gui, 7: +LastFound 
			Parent_Handle :=WinExist()
 
		;子(内枠)
		cO:=1
		cS:=pS-2
		Gui, 8: Margin, 0, 0 
		Gui, 8: -Border +ToolWindow +AlwaysOnTop -Caption -HScroll -VScroll
		Gui, 8: Show, x%cO% y%cO% w%cS% h%cS%
		GUI, 8: Color, FFFFFF
			Gui, 8: +LastFound 
			Child_Handle :=WinExist()
 
		;子2(インジケータ)
		cO:=1
		cS:=pS-4
		Gui, 9: Margin, 0, 0 
		Gui, 9: -Border +ToolWindow +AlwaysOnTop -Caption -HScroll -VScroll
		Gui, 9: Show, x%cO% y%cO% w%cS% h%cS%
		GUI, 9: Color, 888888
			Gui, 9: +LastFound 
			Child2_Handle :=WinExist()
 
		;親子処理
		DllCall( "SetParent", "uint", Child_Handle, "uint", Parent_Handle )
		DllCall( "SetParent", "uint", Child2_Handle, "uint", Child_Handle )
	}
 
return
 
;-----------------------------------------------------------
;-----------------------------------------------------------
;以下ルーチン
;-----------------------------------------------------------
;-----------------------------------------------------------
 
ShowWindow(switch,TA)
;-----------------------------------------------------------
;ウィンドウの表示/非表示を切替
; switch	…	0=Hide 1=Show
;-----------------------------------------------------------
{
	global VISIBLE,INVISIBLE
	;tooltip %TA%
	a:=""
		if(switch=0){
			WinSet, Trans, %INVISIBLE%,	%TA%
			a:=INVISIBLE
		}
		if(switch=1){
			WinSet, Trans, %VISIBLE%,	%TA%
			a:=VISIBLE
		}
	return a
}
 
AllShow()
;-----------------------------------------------------------
; 基本機能のオンオフ切替
;-----------------------------------------------------------
{
 
	global TA_TOOL,TA_COL,TA_LAY,TA_NAV
	global ForceToShow
	global aTOL,aCOL,aLAY,aNAV
 
	if(ForceToShow=0){
		SetTimer, MouseCheck, Off
			aTOL:=ShowWindow(1,TA_TOOL)
				Gui,7:Hide
			aCOL:=ShowWindow(1,TA_COL)
			aLAY:=ShowWindow(1,TA_LAY)
			aNAV:=ShowWindow(1,TA_NAV)
 
		ForceToShow:=1
		return
	}
 
	if(ForceToShow=1){
		SetTimer, MouseCheck, On
		ForceToShow:=0
		return
	}
	return
}
 
AllShowRealtime()
;-----------------------------------------------------------
; 基本機能のオンオフ切替 (押してる間だけ)
;-----------------------------------------------------------
{
	PushThishotkey=%A_Thishotkey%
 
	global TA_TOOL,TA_COL,TA_LAY,TA_NAV
	global ForceToShow
	global aTOL,aCOL,aLAY,aNAV
 
	;機能停止
	SetTimer, MouseCheck, Off
		aTOL:=ShowWindow(1,TA_TOOL)
			Gui,7:Hide
		aCOL:=ShowWindow(1,TA_COL)
		aLAY:=ShowWindow(1,TA_LAY)
		aNAV:=ShowWindow(1,TA_NAV)
	ForceToShow:=1
	;待ち
	UpKeyAlert:=0
	loop{
		sleep,100
		GetKeyState, Stat, %PushThishotkey%
		If (Stat="U"){
			break
		}
		;sleep,5000
	}
 
	;機能再開
	SetTimer, MouseCheck, On
	ForceToShow:=0
 
	return
}
 
AllHide()
;-----------------------------------------------------------
; すべてのパネルを隠す
;-----------------------------------------------------------
{
	global SW_TOOL,SW_COL,SW_LAY,SW_NAV
	global TA_TOOL,TA_COL,TA_LAY,TA_NAV
	global aTOL,aCOL,aLAY,aNAV
		if (SW_TOOL=1){
			aTOL:=ShowWindow(0,TA_TOOL)
			Gui,7:Hide
		}
		if SW_COL=1
			aCOL:=ShowWindow(0,TA_COL)
		if SW_LAY=1
			aLAY:=ShowWindow(0,TA_LAY)
		if SW_NAV=1
			aNAV:=ShowWindow(0,TA_NAV)
	return
}
 
IsHit(X,Y,XL,YU,XR,YB,IsPanelVisible,Rect)
;-----------------------------------------------------------
; 二つの矩形の当たり判定を行う
; X,Y			…	マウス位置
; XL,YU,XR,YB	…	矩形2
; IsPanelVisible… パネルが表示されてるかどうか
; Rect ... 0 無指定
;        ... 1 上辺..未実装(ごめんネ!)
;        ... 2 右辺
;        ... 3 下辺..未実装(ごめんネ!)
;        ... 4 左辺
;-----------------------------------------------------------
{
	global PadLeave,PadClose,PadRectClose
	global VISIBLE,INVISIBLE
 
	hit:=0
	;初回処理
	if(IsPanelVisible=""){
		t:="初回"
	}
	;パネルがない時(パネルに近づくとき)
	if(IsPanelVisible=INVISIBLE){
		t:="近"
		;左辺
		if (Rect=4){
			if( ( XL < X ) && ( X < XL + PadRectClose ) && ( YU < Y ) && ( Y < YB ) ){
				hit:=1
			}
		}
		;右辺
		if (Rect=2){
			if( ( XR - PadRectClose < X ) && ( X < XR ) && ( YU < Y ) && ( Y < YB ) ){
				hit:=1
			}
		}
		;無指定(中心)
		if (Rect=0){
			if( ( XL + PadClose < X ) && ( X < XR - PadClose ) && ( YU + PadClose < Y )  && (Y < YB - PadClose ) ){
				hit:=1
			}
		}
	}
	;パネルがある時(パネルから離れるとき)
	if(IsPanelVisible=VISIBLE){
		t:="離"
		if( (	XL + PadLeave		< X ) && (	X < XR - PadLeave		) && (	YU + PadLeave		< Y ) && (	Y < YB - PadLeave		) ){
			hit:=1
		}
	}
 
	;tooltip, hit=%hit% t=%t%	X=%X% Y=%Y% XL=%XL% YU=%YU% XR=%XR% YB=%YB% IsPanelVisible=%IsPanelVisible% Rect=%Rect%
	if (hit=1){
		return true
	} else {
	   return false
	}
}
 
MouseCheckCommon(X,Y,alpha,TA,HEN){
;-----------------------------------------------------------
;マウスチェック処理共通部
;-----------------------------------------------------------
	global VISIBLE,INVISIBLE
	global ForceToShow
 
	;ウィンドウの透過値取得
	IsPanelVisible:=alpha
	;消す2(起動したてのときなど)
	if (IsPanelVisible=""){
		alpha:=ShowWindow(0,TA)
	}
	WinGetPos, X1, Y1, W, H, %TA%
	hit:=IsHit(X,Y,	X1,Y1,X1+W,Y1+H,IsPanelVisible,HEN)
	;出す
	if (hit=1 && IsPanelVisible=INVISIBLE)
		alpha:=ShowWindow(1,TA)
	;消す
	if (hit=0 && IsPanelVisible=VISIBLE && ForceToShow=0)
		alpha:=ShowWindow(0,TA)
 
	;tooltip, X=%X% Y=%Y%  alpha=%alpha% TA=%TA% HEN=%HEN% IsPanelVisible=%IsPanelVisible% hit=%hit%
	return alpha
}
 
MouseCheck:
;-----------------------------------------------------------
;マウスチェック処理
;-----------------------------------------------------------
	;SAIがアクティブじゃないなら戻る
	If !WinActive("ahk_class sfl_window_class"){
		AllHide()
		return
	}
 
	;ツール
	if (SW_TOOL=1){
		;色インジケータ更新
		getToolCol()
	}
 
 
	;クリック中待機
	loop{
		LButtonStat:=GetKeyState("LButton")
		If (LButtonStat=0){
			break
		}
		return
		;sleep,100
	}
 
	;マウス座標取得
	MouseGetPos, X , Y
 
	;ツール
	if (SW_TOOL=1){
		aTOL:=MouseCheckCommon(X,Y,aTOL,TA_TOOL,HEN_TOOL)
	}
	;カラー
	if (SW_COL=1){
		aCOL:=MouseCheckCommon(X,Y,aCOL,TA_COL,HEN_COL)
	}
	;レイヤ
	if (SW_LAY=1){
		aLAY:=MouseCheckCommon(X,Y,aLAY,TA_LAY,HEN_LAY)
	}
	;ナビゲータ
	if (SW_NAV=1){
		aNAV:=MouseCheckCommon(X,Y,aNAV,TA_NAV,HEN_NAV)
	}
return
 
getToolCol()
;-----------------------------------------------------------
;ツールウィンドウの選択色を取得して表示
;-----------------------------------------------------------
{
	global TA_TOOL
	global VISIBLE,INVISIBLE
	global aTOL
	global pS
 
	;ツールウィンドウの位置(スクリーン)
	WinGetPos, TolX, TolY, , , %TA_TOOL%
 
	;選択色ボックスのハンドル
	ControlGet,tolColHwnd,Hwnd,, sfl_window_class1, %TA_TOOL%
		;選択色ボックスの位置(ツールウィンドウに対して)
		ControlGetPos, tolColX, tolColY, , , sfl_window_class1, %TA_TOOL%
 
	;GUI位置
	X:=TolX+tolColX+2
	Y:=TolY+tolColY+0
 
	;色取得位置(選択色ボックス基準)
	getX:=10
	getY:=10
	;選択色ボックスのデバイスコンテキストを取得して色を拾って破棄
	hdcTolCol	:=	DllCall("GetDC",UInt,tolColHwnd)
	col			:=	DllCall("GetPixel", UInt, hdcTolCol, Int,getX, Int,getY)
					DllCall( "gdi32.dll\DeleteDC"    , UInt, hdcTolCol )
	;BGR=>RGB
	col:=ReverseR&B(col)
	;インジケータの色変更
	GUI, 9: Color, %col%
 
	IsPanelVisible:=aTOL
	if (IsPanelVisible=VISIBLE){
		Gui, 7: Hide
	}else{
		Gui, 7: Show, NA x%X% y%Y% w%pS% h%pS%
	}
 
	return
}
 
ReverseR&B(Color){		
;-----------------------------------------------------------
; Color RRGGBB >> BBGGRR >> RRGGBB 変換  2009-05-19
; http://d.hatena.ne.jp/ajinoya/20090605/1244158617
;-----------------------------------------------------------
	SetFormat, INTEGER, H
	RevColor := ((Color & 0xFF) << 16) + (Color & 0xFF00) + ((Color & 0xFF0000) >> 16)
	RevColor := "" . RevColor 
	StringTrimLeft, RevColor, RevColor, 2
	RevColor := "000000" . RevColor
	StringRight, RevColor, RevColor, 6
	SetFormat, INTEGER, D
	Return RevColor
}
 
ExitSub:
;-----------------------------------------------------------
;終了処理
;-----------------------------------------------------------
	SetTimer, MouseCheck, Off
		if SW_TOOL=1
			aTOL:=ShowWindow(1,TA_TOOL)
		if SW_COL=1
			aCOL:=ShowWindow(1,TA_COL)
		if SW_LAY=1
			aLAY:=ShowWindow(1,TA_LAY)
		if SW_NAV=1
			aNAV:=ShowWindow(1,TA_NAV)
	exitapp
 
;-----------------------------------------------------------
;-----------------------------------------------------------
#IfWinActive, SAI ahk_class sfl_window_class
vkF2sc070::AllShow()			;ひらがなカタカナキーvkF2sc070:
;vkF2sc070::AllShowRealtime()	;ひらがなカタカナキーvkF2sc070:
 
;ボタン割り当て時
numpad5::AllShowRealtime()
 
;-----------------------------------------------------------
#IfWinActive
~^F12::Reload