「マニュアル/Tips一覧/AutoHotKey/パネルを自動的に隠す」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
- やや修正 -- 名無し (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)
- 「レイヤー名の変更」ダイアログも消えちゃう問題を解消。 -- 名無し (2010-11-03 13:53:53)
#comment(,disableurl)
#highlight(lisp){{
;//////////////////////////////////////////////////////////
; 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
;消すパネルを選ぶ 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
firstDetect:=1
;処理部で使いまわす変数
IsPanelVisible:=1
;透過値管理
aTOL:=VISIBLE
aCOL:=VISIBLE
aLAY:=VISIBLE
aNAV:=VISIBLE
;パネル検索用データ
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
;ウィンドウ指定を完全一致に
SetTitleMatchMode,3
;終了時
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 WinExist("ahk_class sfl_window_class"){
if (firstDetect=1){
sleep,1000
AllHide()
}
firstDetect:=0
}else{
firstDetect:=1
}
;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
}}
このページでの公開は終了しました。→→[[こちら参照>http://www3.atwiki.jp/sai/pages/219.html]]