XREA.COM Logo XREA.COM Ad

旧雑記サルベージ

92管理人 ★:06/09/06 17:40 ID:???
2006年01月21日
■AutoHotkeyでタスク切り替えを作ってみた

作ってみることに。
とりあえず、Alt+Tabに表示するウィンドウをどう判定するかを考える。
フォルダオプションなどのダイアログなど、タスクバーに表示されないのにAlt+Tabに表示されるウィンドウがあったり、色々と謎が多い。

やっかいなのがDelphi製のソフトのTApplicationというクラス名のウィンドウ。
可視ウィンドウ扱いで、タスクバーにはこのウィンドウのタイトルが表示されるが、実際には大きさがゼロで画面には表示されない。
VxEditorなど、TApplicationが不可視になっているものもある。
Alt+Tabのリストには、実際に見えているウィンドウが表示されるが、中にはTApplicationがAlt+Tabのリストに表示されているらしいものもあってややこしい。

とりあえず、ウィンドウスタイルが条件になっているのだろうと思い、条件を調べることに。
全てのウィンドウスタイルと拡張スタイルについて、そのスタイルを持つ可視ウィンドウの一覧を列挙するというスクリプトを作成し、Alt+Tabの表示と比較してみたところ、とりあえずWS_DISABLEDになっていると表示されないことがわかった。
WS_EX_TOOLWINDOWはAlt+Tabに表示されないという説明があったが、WS_EX_TOOLWINDOWでもAlt+Tabに表示されるものがあるので当てにならない。


結局よくわからないので、、適当にそれっぽい物を組み合わせることに。
WS_POPUPを除外すれば大体正しくなるが、フォルダオプションのダイアログなどが表示されなくなってしまうので、WS_POPUPなウィンドウで除外したくないものに共通しているスタイルを探したところ、0x80(DS_MODALFRAME)がそれっぽかった。
微妙にAlt+Tabとは違う気がするが、面倒なんでこれでいいことにする。


リストの表示には、とりあえずリストビューを使ってみる。
せっかくだから、ウィンドウのアイコンを表示できるようにしてみる。
AutoHotkeyの標準機能では、ファイルからアイコンを追加することしかできないが、ImageList_AddIconというAPIでアイコンハンドルを指定して追加することができるらしい。
アイコンハンドルは、WM_GETICONメッセージで取得する方法と、GetClassLongというAPIでGCL_HICONを調べる方法があるらしいが、取得できる場合とできない場合がある。
両方試して、それでも駄目なら大きいアイコンで代用するようにしたら、ほとんどのウィンドウのアイコンを取得できるようになった。

そんなわけで、とりあえず作ったもの。
ついでだからウィンドウスタイルなども表示し、プロセス名でソートするようにしてみた。
WinGet,w,List,,,joijpouhpoijjjjjjj
Gui,Margin,0,0
Gui,Font,s9
Gui,Add,ListView,w800 r%w% vLv gLvEvent AltSubmit,HWND|Title|Class|Pid|ProcessName|Style|ExStyle
himl:=IL_Create(w,w,0)
LV_SetImageList(himl,1)
cnt=0
Loop,%w%{
    id:=w%A_Index%
    SetFormat,Integer,H
    WinGet,s,Style,ahk_id %id%
    SetFormat,Integer,D
    if((!(s&0x08000000))&&((s&0x80)|| !(s&0x80000000))){
        cnt++
        WinGet,e,ExStyle,ahk_id %id%
        WinGet,pid,PID,ahk_id %id%
        WinGet,pn,ProcessName,ahk_id %id%
        WinGetClass,c,ahk_id %id%
        WinGetTitle,t,ahk_id %id%
        i:=DllCall("GetClassLong",UInt,id,Int,-34)
        if(i=0)
        {
            i:=DllCall("SendMessage",UInt,id,UInt,0x7F,UInt,0,UInt,0,UInt)
            if(i=0)
            {
                i:=DllCall("SendMessage",UInt,id,UInt,0x7F,UInt,1,UInt,0,UInt)
            }
        }
        icon:=DllCall("ImageList_AddIcon",Int,himl,Int,i,Int)+1
        LV_Add("Icon" . icon ,id,t ,c,pid,pn,s,e)
    }
}
LV_ModifyCol()
LV_ModifyCol(2,300)
LV_ModifyCol(3,120)
LV_ModifyCol(5,"Sort")
h:=20+cnt*13
GuiControl,Move,LV,h%h%

Gui,Show,AutoSize
return


LvEvent:
If(A_GuiEvent="Normal"){
    LV_GetText(id,A_EventInfo,1)
    WinActivate,ahk_id %id%
    ExitApp
}
return
131KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08