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

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

マニュアル/Tips一覧/AutoHotKey/パネルを自動的に隠す - (2010/01/26 (火) 15:01:35) の編集履歴(バックアップ)


;//////////////////////////////////////////////////////////
; HkSaiパネラー
; 無保証・再配布・改変自由
;
; 動作 AutoHotKey 1.0.48.05
; 推奨 SAI 1.1.0
;
; 使用法
;  指定したパネルからカーソルが遠ざかるとパネルが隠れます。
;  ひらがなカタカナキーで機能の停止・再開が切り替えできます。
;
;  2010/01/23 HIDE/SHOWが遅いので、DLL直に変更。 ホットキー押してる時だけ表示(AllShowRealtime())追加
;  2010/01/10 修正
; 2009/12/26
;  作成
;
;-----------------------------------------------------------
; 設定
;-----------------------------------------------------------
; Leave値を超えてカーソルが離れるとパネルを隠す
; Close値を超えてカーソルが近づくとパネルを表示
 ;通常矩形モード(パネルと同じ領域を当たり判定に利用。)
  PadLeave:=+30
  PadClose:=-10
 ;Rect指定モード(上下左右いずれかの辺を利用。)(現在レイヤパレットのみ)
  PadRectLeave:=+70
  PadRectClose:=-40
 
;マウスをチェックする間隔(ms)
TimerMiliSec:=50
 
; ツールパネルを消す
SW_TOOL:=1
; カラーパネルを消す
SW_COL:=1
;レイヤーパネルを消す
SW_LAY:=1
 
;-----------------------------------------------------------
;設定ここまで
;-----------------------------------------------------------
#MaxThreads 5
#MaxThreadsPerHotkey 1
#HotkeyInterval 1000 ; This is  the default value (milliseconds).
#MaxHotkeysPerInterval 50 ; This is the default value.
;-----------------------------------------------------------
 
ShowWindow(switch,TA)
;-----------------------------------------------------------
;ウィンドウの表示/非表示を切替
; switch	…	0=Hide 1=Show
;-----------------------------------------------------------
{
		if(switch=0){
			DllCall("ShowWindow" , "UInt",TA, "Uint",0)	;0=SW_HIDE
		}
		if(switch=1){
			DllCall("ShowWindow" , "UInt",TA, "Uint",5)	;5=SW_SHOW
		}
	return
}
 
AllShow()
;-----------------------------------------------------------
; 基本機能のオンオフ切替
;-----------------------------------------------------------
{
 
	global hWnd_TOOL,hWnd_COL,hWnd_LAY,ForceToShow
 
	if(ForceToShow=0){
		SetTimer, MouseCheck, Off
			ShowWindow(1,hWnd_TOOL)
			ShowWindow(1,hWnd_COL)
			ShowWindow(1,hWnd_LAY)
		ForceToShow:=1
		return
	}
 
	if(ForceToShow=1){
		SetTimer, MouseCheck, On
		ForceToShow:=0
		return
	}
	return
}
 
AllShowRealtime()
;-----------------------------------------------------------
; 基本機能のオンオフ切替 (押してる間だけ)
;-----------------------------------------------------------
{
	global hWnd_TOOL,hWnd_COL,hWnd_LAY,ForceToShow
 
	;機能停止
	SetTimer, MouseCheck, Off
		ShowWindow(1,hWnd_TOOL)
		ShowWindow(1,hWnd_COL)
		ShowWindow(1,hWnd_LAY)
	ForceToShow:=1
 
	;待ち
	loop{
		GetKeyState, Joy1Stat, Joy1
		If (Joy1Stat="U")
			break
		sleep,50
	}
 
	;機能再開
	SetTimer, MouseCheck, On
	ForceToShow:=0
 
	return
}
 
AllHide()
;-----------------------------------------------------------
; すべてのパネルを隠す
;-----------------------------------------------------------
{
	global SW_TOOL,SW_COL,SW_LAY,hWnd_TOOL,hWnd_COL,hWnd_LAY
		if SW_TOOL=1
			ShowWindow(0,hWnd_TOOL)
		if SW_COL=1
			ShowWindow(0,hWnd_COL)
		if SW_LAY=1
			ShowWindow(0,hWnd_LAY)
	return
}
 
IsHit(X0,Y0,X1,Y1,X2,Y2,X3,Y3,IsPanelVisible,Rect)
;-----------------------------------------------------------
; 二つの矩形の当たり判定を行う
; X0,Y0,X1,Y1	…	矩形1
; X2,Y2,X3,Y3	…	矩形2
; IsPanelVisible… パネルが表示されてるかどうか
; Rect   上下左右いずれか一辺の領域をhit領域にするフラグ
;        ※現在レイヤパレットのみ実装
;        ... 0 無指定(通常矩形)
;        ... 1 x...未実装(ごめんネ!)
;        ... 2 右辺に格納
;        ... 3 x...未実装(ごめんネ!)
;        ... 4 x...未実装(ごめんネ!)
;-----------------------------------------------------------
{
	global PadLeave,PadClose,PadRectLeave,PadRectClose
 
	;パネルがある時(パネルから離れるとき)
	if(IsPanelVisible){
		;tooltip, IsPanelVisible %IsPanelVisible% %Pad%
		if (Rect=2){
			if( (X0 < X3+PadRectLeave) && (X2-PadRectLeave < X1) && (Y0 < Y3+PadRectLeave) && (Y2-PadRectLeave < Y1))
			return true
		}
		if (Rect=0){
			if( (X0 < X3+PadLeave) && (X2-PadLeave < X1) && (Y0 < Y3+PadLeave) && (Y2-PadLeave < Y1))
			return true
		}
	}
	;パネルがない時(パネルに近づくとき)
	if(IsPanelVisible=0){
		;tooltip, IsPanelVisible %IsPanelVisible% %Pad%
 
		if (Rect=2){
			if( (X0 < (X3-PadRectClose)) && (X2+(X3-X2)+PadRectClose < X1) && (Y0 < Y3) && (Y2 < Y1))
			return true
		}
 
		if (Rect=0){
			if( (X0 < X3+PadClose) && (X2-PadClose < X1) && (Y0 < Y3+PadClose) && (Y2-PadClose < Y1))
			return true
		}
 
 
	}
   return false
}
 
;-----------------------------------------------------------
;初期化
;-----------------------------------------------------------
 
	ForceToShow:=0
	IsPanelVisible:=1
 
	TA_TOOL:="ツール ahk_class sfl_window_class"
	TA_COL:="カラー ahk_class sfl_window_class"
	TA_LAY:="レイヤー ahk_class sfl_window_class"
 
	CoordMode,Mouse,Screen
	SetTitleMatchMode,3
		if (SW_TOOL=1){
			WinGet, temp1, ID, %TA_TOOL%
			hWnd_TOOL:=temp1
			TA_TOOL:="ahk_id " temp1
			WinGetPos, ToolX, ToolY, ToolW, ToolH, %TA_TOOL%
		}
		if (SW_COL=1){
			WinGet, temp2, ID, %TA_COL%
			hWnd_COL:=temp2
			TA_COL:="ahk_id " temp2
			WinGetPos, ColX, ColY, ColW, ColH, %TA_COL%
		}
		if (SW_LAY=1){
			WinGet, temp3, ID, %TA_LAY%
			hWnd_LAY:=temp3
			TA_LAY:="ahk_id " temp3
			WinGetPos, LayX, LayY, LayW, LayH, %TA_LAY%
		}
	SetTitleMatchMode,1
 
	;終了時
	OnExit, ExitSub
	;タイマー
	SetTimer, MouseCheck, %TimerMiliSec%
return
 
MouseCheck:
;-----------------------------------------------------------
;メイン
;-----------------------------------------------------------
	If !WinActive("ahk_class sfl_window_class"){
		AllHide()
		return
	}
 
	loop{
		LButtonStat:=GetKeyState("LButton")
		If (LButtonStat=0)
			break
		sleep,100
	}
 
 
	MouseGetPos, X , Y
 
	if (SW_TOOL=1){
		;// ツール //////////////////////
		;ウィンドウある?
		IsPanelVisible:=WinExist(TA_TOOL) 
		if IsPanelVisible
			WinGetPos, ToolX, ToolY, ToolW, ToolH, %TA_TOOL%
		hit:=IsHit(X,Y,X,Y,	ToolX,ToolY,ToolX+ToolW,ToolY+ToolH,IsPanelVisible,0)
		;出す
		if (hit=1 && !IsPanelVisible)
				ShowWindow(1,hWnd_TOOL)
		;消す
		if (hit=0 && IsPanelVisible && ForceToShow=0)
				ShowWindow(0,hWnd_TOOL)
		;////////////////////////
	}
	if (SW_COL=1){
		;// カラー //////////////////////
		;ウィンドウある?
		IsPanelVisible:=WinExist(TA_COL) 
		if IsPanelVisible
			WinGetPos, ColX, ColY, ColW, ColH, %TA_COL%
		hit:=IsHit(X,Y,X,Y,	ColX,ColY,ColX+ColW,ColY+ColH,IsPanelVisible,0)
		;出す
		if (hit=1 && !IsPanelVisible)
				ShowWindow(1,hWnd_COL)
		;消す
		if (hit=0 && IsPanelVisible && ForceToShow=0)
				ShowWindow(0,hWnd_COL)
		;////////////////////////
	}
	if (SW_LAY=1){
			;// レイヤー //////////////////////
			;ウィンドウある?
			IsPanelVisible:=WinExist(TA_LAY) 
			if IsPanelVisible
				WinGetPos, LayX, LayY, LayW, LayH, %TA_LAY%
			hit:=IsHit(X,Y,X,Y,	LayX,LayY,LayX+LayW,LayY+LayH,IsPanelVisible,2)
			;出す
			if (hit=1 && !IsPanelVisible)
				ShowWindow(1,hWnd_LAY)
			;消す
			if (hit=0 && IsPanelVisible && ForceToShow=0)
				ShowWindow(0,hWnd_LAY)
			;////////////////////////
	}
return
 
 
ExitSub:
;-----------------------------------------------------------
;終了処理
;-----------------------------------------------------------
	SetTimer, MouseCheck, Off
		if SW_TOOL=1
			ShowWindow(1,hWnd_TOOL)
		if SW_COL=1
			ShowWindow(1,hWnd_COL)
		if SW_LAY=1
			ShowWindow(1,hWnd_LAY)
	exitapp ; テスト用
 
;-----------------------------------------------------------
;-----------------------------------------------------------
#IfWinActive, SAI ahk_class sfl_window_class
vkF2sc070::AllShow()	;ひらがなカタカナキーvkF2sc070:
Joy1::AllShowRealtime()
 
;-----------------------------------------------------------
#IfWinActive
 
 

  • やや修正 -- 名無し (2010-01-19 01:41:55)
  • やや修正 -- 名無し (2010-01-23 07:06:35)
名前:
コメント: