タグ:AutoHotKey ( 73 ) タグの人気記事

AutoHotKey_Lで、Operaのセッションをブックマークに書き込んでみた。

 Operaのセッションを解析してブックマークに書き込むスクリプト。bookmarks.adrの仕様が不明瞭だったので、とりあえずテキストに書き出したのが前回。だがつい先日、実は最低限必要なのはNAMEとURLだけ(他はOperaの起動時に補完される)と知り、さっそくやってみた。

 以下のスクリプトを適当に保存し、"bookmarks.adr"のフルパスを書き込んだら準備完了。あとはセッションファイルを引数にして呼び出す(ドロップ可。複数ファイル対応)と、ブックマークに変換される。その後、Operaを起動すると数秒ののち、"[Session] セッションファイル名"というフォルダにセッションの内容が!

 ちょっといじって、スクリプト冒頭で挙動設定を可能にしてみた。デフォルトだと「タブ履歴無視」「プレーンテキストで保存」なので、いじってみるよろし。bookmarks.adrの指定も忘れないように。

; -------- --------- --------- --------- ---------
; OperaSession2Bookmarks.ahk
; -------- --------- --------- --------- ---------
  BookmarksPath := "C:\Program Files\Opera Next\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  HisSW := 0  ; タブの履歴(そのタブで表示したページの履歴)をどうするかの設定。 0:最後に表示したアドレスのみ読み込む。 1:すべて読み込む。
  WriteSW := 0  ; 書き込み先の設定。 0:セッションと同じ位置にプレーンテキストで保存。 1:bookmarks.adrに書き込む。

  If (1 == WriteSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, %BookmarksPath%が見つかりません。
      Exit
    }
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%
  }

  Loop, %0%
  {
    CmdLineBuf := %A_Index%
    Loop %CmdLineBuf%, 1
      CmdLine := A_LoopFileLongPath
    FileRead, OSession, *P65001 *t %CmdLine%
    If (ErrorLevel) {
      MsgBox, Session File Read Error
      Exit
    }

    SplitPath, CmdLine, , , , SessionName
    Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
    Header := Result
    Idx := 0

    Loop
    {
      Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, idx + 1)
      If (0 == Idx)
        Break
      WinNum := $1
      HisNum := $2 - 1
      StringLen, HisNumLen, HisNum

      RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
      HisTitle := $1
      RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
      HisUrl := $1

      If (0 == HisSW) {  ; タブ履歴を無視する場合
        Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
        Continue
      }

      If (0 == HisNum) {
        Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
        Continue
      }

      Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

      Loop, %HisNum%
      {
        HisNum--
        RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
        HisTitle := $1
        RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
        HisUrl := $1
        Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      }
      Result .= "-`n`n"
    }

    If (Header == Result)
      Continue
    Result .= "-`n`n"

    If (1 == WriteSW) {
      FileAppend, %Result%, %BookmarksPath%, CP65001  ; bookmarks.adrに直接書き込む
    } Else {
      FileDelete, %CmdLine%.txt  ; ↓のファイルがすでに存在していたら削除(やらないと追記)
      FileAppend, %Result%, %CmdLine%.txt, CP65001  ; セッションと同じ位置に書き出す
    }
  }
  MsgBox, Finish!
Return

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  Return, Num
}

 これで大量のタブを気軽に記録できる。あと、OperaLinkでセッション(だったもの)が共有できる副作用も。
 まさにすべてのOpera-erへの福音(えー。


[PR]
by lordnoesis | 2012-01-10 20:32 | テクノロジ | Trackback | Comments(0)

MouseGesture.ahkでウィンドウ操作メニュー表示してみた。2

 リリース直後に即更新。前回のは実はα版だったんだよ!!! Ω ΩΩ {後付け乙。

 というわけで、ウィンドウ操作メニューを表示するMouseGesture2用スクリプトver.1.0.1。

  • 変更点
    • メニュー呼び出しを「タイトルバー右側のボタンを右クリック」で行うように変更。
    • 操作対象をアクティブウィンドウではなく、右クリックしたウィンドウに変更。
    • 入れ忘れてた最前面固定を追加。

 まず、ソース内のコメントに従い以下のスクリプトを導入。3箇所あるので注意。

; -------- --------- --------- --------- ---------
; 以下を"MG_User.ahk"の初期化処理セクションに追加。
; -------- --------- --------- --------- ---------

MenuId_Max := 0, ItemId := 0, HieLv := 0
MenuId_Cur := "WH" MenuId_Max
Menu, WH0, Add, 最前面, WH_Topmost
Menu, WH0, Add
Loop,Read, WinHack.txt
{
  RegExMatch(A_LoopReadLine, "^\s?([\[\]\;]|----)?\s?([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)", $)
  if(";" == $1)
    Continue
  ItemId++
  if("[" == $1) {
    MenuId_HL%HieLv% := MenuId_Cur
    MenuId_Max++
    MenuId_Cur := "WH" MenuId_Max
    %MenuId_Cur%_Text := $2
    ItemId_HL%HieLv% := ItemId
    ItemId := 0
    HieLv++
    Continue
  }
  if("]" == $1) {
    HieLv--
    MenuId_HLUpp := MenuId_HL%HieLv%
    MenuId_Cur_Text := %MenuId_Cur%_Text
    Menu, %MenuId_HLUpp%, Add, %MenuId_Cur_Text%, :%MenuId_Cur%
    MenuId_Cur := MenuId_HLUpp
    ItemId := ItemId_HL%HieLv%
    Continue
  }
  WM_X%MenuId_Cur%_%ItemId% := $3
  WM_Y%MenuId_Cur%_%ItemId% := $4
  WM_W%MenuId_Cur%_%ItemId% := $5
  WM_H%MenuId_Cur%_%ItemId% := $6
  Menu, %MenuId_Cur%, Add, %$2%, WH_WM
}
Menu, WH0, Add
Menu, WH_WK, Add, 実行, WH_WK
Menu, WH_Etc, Add, 強制終了, :WH_WK
Menu, WH_Etc, Add, プログラムのフォルダを開く(&O), WH_AppDirOpen
Menu, WH_Etc, Add
Menu, WH_Etc, Add, WinHack.txtを開く, WH_SettingOpen
Menu, WH0, Add, その他, :WH_Etc


; -------- --------- --------- --------- ---------
; 以下を"MG_User.ahk"のサブルーチン定義セクションに追加。
; -------- --------- --------- --------- ---------

WH_Show:
  WinGet, state, ExStyle, ahk_id %MG_HWND%
  If ((0x00000008 & state) != 0)
    Menu, WH0, Check, 最前面
  else
    Menu, WH0, UnCheck, 最前面
  Menu, WH0, Show
return

WH_Topmost:
  WinSet, Topmost, TOGGLE, ahk_id %MG_HWND%
return

WH_WM:
  WM_X := WM_X%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_Y := WM_Y%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_W := WM_W%A_ThisMenu%_%A_ThisMenuItemPos%
  WM_H := WM_H%A_ThisMenu%_%A_ThisMenuItemPos%
  WinMove, ahk_id %MG_HWND%, , %WM_X%, %WM_Y%, %WM_W%, %WM_H%
return

WH_WK:
  WinKill, ahk_id %MG_HWND%
return

WH_AppDirOpen:
  wmi := ComObjGet("winmgmts:")
  queryEnum := wmi.ExecQuery(""
    . "Select * from Win32_Process where ProcessId=" . MG_PID)
    ._NewEnum()
  if queryEnum[process] {
    RegExMatch(process.CommandLine, """?([^""]+|[^\s]+)""?", $)
    SplitPath, $1, , AppDir
    Run, explore %AppDir%
  }
  wmi := queryEnum := process := ""
return

WH_SettingOpen:
  Run, WinHack.txt
return


; -------- --------- --------- --------- ---------
; 以下をMouseGesture2にインポート
; -------- --------- --------- --------- ---------

[TitleBarButton]
Custom=MG_HitTest()="MinButton"
Custom=MG_HitTest()="MaxButton"
Custom=MG_HitTest()="CloseButton"

[RB__]
G=RB__
TitleBarButton=GoSub,WH_Show

 [TitleBarButton]、右側ボタンだけだと右側見えてない時に無力なので、「タイトルバーのアイコン」とか「枠」「リサイズ可能な枠」あたりも追加した方がよさげ。ただし「ヘルプボタン」はOperaで誤爆するのでお勧めできない

 次に、"MouseGesture.ahk"と同じ位置に"WinHack.txt"を作成し、ウィンドウ移動・サイズ変更設定を書き込む。書式は以下を参考に。

; -------- --------- --------- --------- ---------
; 書式は以下の通り。
;
; ・"["と"]"でサブメニュー化。ネストも可。
; ・"メニュー項目名, X, Y, Width, Height"でウィンドウ移動・サイズ変更項目を作成可能。
; ・";"で始まる行はコメント行。
; ・上の書式に沿わない行(空改行も含む)はセパレータになる。
; -------- --------- --------- --------- ---------

[移動 (&I)
  基準座標に戻す (&W), 0, 0
  タスクバーを避ける, 165, , ,
  ----
  左656, 0, 0, 656 ,1050
  右1024, 656, 0, 1024 ,1050
  右1024, 656, 0, 1024 ,1050
  ----
  左1024, 0, 0, 1024 ,1050
  右656, 1024, 0, 656 ,1050
]
[リサイズ (&R)
  850*635, , ,850 ,635
  1130*850, , ,1130 ,850
  ----
;  800*600, , ,800 ,600
  1024*768, , ,1024 ,768
  1280*1024, , ,1280 ,1024
]


[PR]
by lordnoesis | 2012-01-10 18:03 | テクノロジ | Trackback | Comments(0)

MouseGesture.ahkでウィンドウ操作メニュー表示してみた。

 Windows7環境で古いmenuHackerがソフトを巻き込んで落ちるので困っていたのだが、よく考えたら独自コマンドの表示さえできればいいのだと気づき、MouseGesture.ahkでそれっぽいものを作ってみた。

 mHの設定ファイルっぽいなにかを読み込むようにしたら、ちょっとばかり複雑化。詳しいことはスクリプト読んでもらうとして、簡単に説明すると「タイトルバーで右クリックすると、本物とは別に独自メニューも隅っこに表示される」というシロモノ。



More
[PR]
by lordnoesis | 2012-01-09 19:00 | テクノロジ | Trackback(1) | Comments(0)

AutoHotKeyで、画像ビューア(MassiGra)の複数ウィンドウ運用を便利にしてみた。

 MassiGraのウィンドウを切り替えたり、並べたりするAHK_Lスクリプト。ANSI版でもたぶん動く。
 MassiGraでなくとも応用効くと思う。

 MassiGraのキー設定で「現在のファイルを開く : Num.」「前のファイル : 上」「次のファイル : 下」にして、複数の画像を開く運用をしていて、ウィンドウ切り替えが面倒なので書いてみた。

 左右キーでウィンドウ切り替え。Ctrl+右でひとつ前のウィンドウを避けて配置。Ctrl+左はリセット(左端に配置)。Esc長押しですべてのMassiGraを閉じる。

;--------------------------------------------------
; MassiGra
;--------------------------------------------------
#WinActivateForce
#IfWinActive ahk_class TF811202_MassiGra_Main

Left::
  WinSet,Bottom,, ahk_class TF811202_MassiGra_Main
  WinActivate, ahk_class TF811202_MassiGra_Main
return

Right::
  WinActivateBottom, ahk_class TF811202_MassiGra_Main
return

$Esc::
  KeyWait, Esc, T1
  if ErrorLevel
  {
    GroupAdd, Massigras, ahk_class TF811202_MassiGra_Main
    GroupClose, Massigras, A
    BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0
  } else {
    Send, {Esc}
  }
  KeyWait, Esc
return

^Left::
  BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0
^Right::
  if (BefWin_XW == NULL)
    BefWin_X := 0, BefWin_W := 0, BefWin_XW := 0

  WinGetActiveStats, NowWin_T, NowWin_W, NowWin_H, NowWin_X, NowWin_Y

  if (BefWin_XW + NowWin_W > A_ScreenWidth) {
    if (BefWin_X == 0) {
      Move_X := A_ScreenWidth - NowWin_W
    } else {
      Move_X := 0
      if (NowWin_W > BefWin_X) {
        if (NowWin_W > (A_ScreenWidth - BefWin_W))
          WinMove, ahk_id %BefWin_Hwnd%, , A_ScreenWidth - BefWin_W
        else
          WinMove, ahk_id %BefWin_Hwnd%, , NowWin_W
      }
    }
  } else {
    Move_X := BefWin_XW
  }

  BefWin_Hwnd := WinActive(A)
  BefWin_X := Move_X
  BefWin_W := NowWin_W
  BefWin_XW := BefWin_X + BefWin_W

  WinMove, Move_X
  WinActivateBottom, ahk_class TF811202_MassiGra_Main
return

 ウィンドウ配置はYも考慮するとややこしくなるので妥協。

 使いやすいタブ対応画像ビューアさえあれば……。


[PR]
by lordnoesis | 2011-11-21 20:56 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaのセッションをテキストに書きだしてみた。

 OperaのセッションファイルからURLとタイトルを抽出してプレーンテキストにするスクリプト。

 セッション溜め過ぎたので整理しようと思ったのだが、Operaでは確認も編集もできないという……。でもきっと世界の誰かが補助ツール作ってるに違いない!と思ったのだが見当たらず。なぜだ。Donutにすらお気に入りグループ編集ツールがあるというのに……。

 使い方は、セッションファイル(.win)のパスを引数にしてスクリプトを呼び出すだけ(スクリプトにドロップで可)。あとは勝手にセッションと同じ位置にテキストファイルが作られる。

  loop, %0%
  {
    CmdLineBuf := %A_Index%
    Loop %CmdLineBuf%, 1
      CmdLine := A_LoopFileLongPath

    FileRead, OSession, *P65001 *t %CmdLine%
    if (ErrorLevel)
    {
      msgbox, File Read Error
      Exit
    }

    WinNum := 2
    result :=
    loop
    {
      idx := RegExMatch(OSession, "\[" WinNum "history url\].+?count=(.*?)\n", $)
      if (0 == idx)
        break
      HisNum := $1 - 1

      RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
      HisTitle := $1
      RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
      HisUrl := $1
      Result = %Result%%HisTitle%`n%HisUrl%`n

      loop, %HisNum%
      {
        HisNum--
        RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
        HisTitle := $1
        RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
        HisUrl := $1
        Result = %Result%  %HisTitle%`n  %HisUrl%`n
      }
      Result = %Result%`n`n
      WinNum++
    }
    if (""==Result)
      Continue
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt
  }

 今回使った正規表現を移植すればAutoHotKey_Lで、Operaの前回セッションを確認・退避できるようにしてみた。2のスクリプトもUTF-8対応になるが、別に困ってないのでいいやっていう。


[PR]
by lordnoesis | 2011-10-28 23:43 | テクノロジ | Trackback(1) | Comments(0)

AutoHotKeyで、Explorerの"表示"の切り替えを便利に。

 AutoHotKeyで、Explorerの並べ替えを便利に。では、PostMessageを使ってExplorerの並び順を操作したが、今回は"表示"を操作するためのパラメータを調べてみた。
 結果は以下の通り。

  • 28713 -- アイコン
  • 28715 -- 一覧
  • 28716 -- 詳細
  • 28717 -- 縮小版
  • 28718 -- 並べて表示

 これらはXPで確認したものだが、Windows7でも(おそらくVistaでも)有効。その場合、縮小版は「中アイコン」になる。
 28714は挙動がよくわからない。以前使ってた表示になる、ような……?

 次に、Windows7で有効なパラメータ。

  • 28747 -- 詳細
  • 28748 -- 並べて表示(拡張)
  • 28749 -- 特大アイコン
  • 28750 -- 中アイコン
  • 28751 -- 大アイコン
  • 28752 -- 小アイコン
  • 28753 -- 一覧
  • 28754 -- コンテンツ

 これを以前のように0x111のパラメータにして送ればよい。


[PR]
by lordnoesis | 2011-06-29 21:13 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaの前回セッションを確認・退避できるようにしてみた。2

 前回のとほぼ同じもの。Opera11.50は、起動時にマスターパスワード入力ダイアログがアクティブになるようになったので、その辺を修正しただけ。アクティブになってるけど、入力欄にフォーカスあたってないようなので、Tabを1回。違いは行差分にして3行。

#WinActivateForce
  SessionsPath := "セッション保存先のパス"
  IniRead, WinCnt, %SessionsPath%autosave.win, session, window count
  if("ERROR" != WinCnt)
  {
    FileRead, SessionBuf, %SessionsPath%autosave.win
    FileDelete, %SessionsPath%autosaveA.win
    FileAppend, %SessionBuf%, %SessionsPath%autosaveA.win, CP932
    GoSub, SessionAnalyze
  }

  run, Opera.exeのパス, , , OpPid
  OpTitle := "パスワード"
  WinWait, %OpTitle% ahk_pid %OpPid%, , 30
  if(ErrorLevel != 0)
    Exit
  WinActivate, %OpTitle% ahk_pid %OpPid%, , 30
;  WinWaitActive, %OpTitle% ahk_pid %OpPid%, , 30
;  if(ErrorLevel != 0)
;    Exit

  Send, {Tab}
Exit


SessionAnalyze:
  loop, %WinCnt%
  {
    IniRead, HisCnt, %SessionsPath%autosaveA.win, %A_index%history title, count
    if("ERROR" == HisCnt)
      Continue
    HisCnt--
    IniRead, WinTitle, %SessionsPath%autosaveA.win, %A_index%history title, %HisCnt%
    WinTitles := WinTitles " " WinTitle "`n"
  }
  if("" == WinTitles)
    return

  MsgBox, 3, 表示後30秒で強制的に起動します。, 最終セッションを退避せずに起動しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, 30
  ifMsgBox, No
  {
    TimeNum := A_Now
    FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%.win
    if(0 < ErrorLevel)
    loop
    {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%_%A_Index%.win
      if(0 == ErrorLevel)
        Break
    }
  }
  ifMsgBox, Cancel
    Exit

return

 そもそもOpera自体が起動時にアクティブとは限らないので、やっぱり強制的にアクティブにするように少し変更。結果として11.50関係なくなったはず。

 11.60では入力欄にフォーカス当たってるので、Opera起動後の"Send, {Tab}"は必要ない。


[PR]
by lordnoesis | 2011-06-29 20:29 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaの前回セッションを確認・退避できるようにしてみた。

 ふとAHK_Lに乗り換えたら、文字コード関連で動かなくなった「AutoHotKeyで、Operaの起動をより便利にしてみた。」のAHK_L版。
 機能的には変わってない。

#WinActivateForce
  SessionsPath := "セッション保存先のパス"
  IniRead, WinCnt, %SessionsPath%autosave.win, session, window count
  if("ERROR" != WinCnt)
  {
    FileRead, SessionBuf, %SessionsPath%autosave.win
    FileDelete, %SessionsPath%autosaveA.win
    FileAppend, %SessionBuf%, %SessionsPath%autosaveA.win, CP932
    GoSub, SessionAnalyze
  }

  run, Opera.exeのパス, , , OpPid
  OpTitle := "パスワード"
  WinWaitActive, %OpTitle% ahk_pid %OpPid%, , 30
  if(ErrorLevel != 0)
    Exit
  WinWaitNotActive, %OpTitle% ahk_pid %OpPid%, , 30
  WinActivate, %OpTitle% ahk_pid %OpPid%, , 30
Exit


SessionAnalyze:
  loop, %WinCnt%
  {
    IniRead, HisCnt, %SessionsPath%autosaveA.win, %A_index%history title, count
    if("ERROR" == HisCnt)
      Continue
    HisCnt--
    IniRead, WinTitle, %SessionsPath%autosaveA.win, %A_index%history title, %HisCnt%
    WinTitles := WinTitles " " WinTitle "`n"
  }
  if("" == WinTitles)
    return

  MsgBox, 3, 表示後30秒で強制的に起動します。, 最終セッションを退避せずに起動しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, 30
  ifMsgBox, No
  {
    TimeNum := A_Now
    FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%.win
    if(0 < ErrorLevel)
    loop
    {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%_%A_Index%.win
      if(0 == ErrorLevel)
        Break
    }
  }
  ifMsgBox, Cancel
    Exit

return

 IniReadはSJISしか読み込めないようなので、自動保存セッションをSJISに変換するという力技。文字化けするかもしれんが気にすんな!


[PR]
by lordnoesis | 2011-06-20 17:50 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、Explorerの並べ替えを便利に。

 エクスプローラの並べ替えにショートカットつけると地味に便利。Ctrl+Nで名前順、Ctrl+Mで更新日時順、Ctrl+Tで種類順、Ctrl+Sでサイズ順。ちなみに、現在と同じ項目で並べ替えをすると逆順になる。

 まずXP向け。それ以前で動くかは知らん。

;--------------------------------------------------
; WindowsExplorer
;--------------------------------------------------
#IfWinActive ahk_class CabinetWClass
^n::PostMessage, 0x111, 30210, 0, , A
^s::PostMessage, 0x111, 30211, 0, , A
^t::PostMessage, 0x111, 30212, 0, , A
^m::PostMessage, 0x111, 30213, 0, , A

#IfWinActive ahk_class ExploreWClass
^n::PostMessage, 0x111, 30210, 0, , A
^s::PostMessage, 0x111, 30211, 0, , A
^t::PostMessage, 0x111, 30212, 0, , A
^m::PostMessage, 0x111, 30213, 0, , A

; デスクトップ
#IfWinActive ahk_class Progman
^n::PostMessage, 0x111, 30210, 0, , A
^s::PostMessage, 0x111, 30211, 0, , A
^t::PostMessage, 0x111, 30212, 0, , A
^m::PostMessage, 0x111, 30213, 0, , A

; ファイルダイアログ
#IfWinActive ahk_class #32770
^n::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30210, 0, , ahk_id %CntHwnd%
return
^s::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30211, 0, , ahk_id %CntHwnd%
return
^t::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30212, 0, , ahk_id %CntHwnd%
return
^m::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30213, 0, , ahk_id %CntHwnd%
return

 そして7向け。Vistaでも動く……んじゃないかな。

;--------------------------------------------------
; WindowsExplorer
;--------------------------------------------------
#IfWinActive ahk_class CabinetWClass
^n::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30211, 0, , ahk_id %CntHwnd%
return
^m::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30212, 0, , ahk_id %CntHwnd%
return
^t::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30213, 0, , ahk_id %CntHwnd%
return
^s::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30214, 0, , ahk_id %CntHwnd%
return

#IfWinActive ahk_class ExploreWClass
^n::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30211, 0, , ahk_id %CntHwnd%
return
^m::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30212, 0, , ahk_id %CntHwnd%
return
^t::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30213, 0, , ahk_id %CntHwnd%
return
^s::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30214, 0, , ahk_id %CntHwnd%
return

;デスクトップ
#IfWinActive ahk_class Progman
^n::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30211, 0, , ahk_id %CntHwnd%
return
^s::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30212, 0, , ahk_id %CntHwnd%
return
^t::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30213, 0, , ahk_id %CntHwnd%
return
^m::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30214, 0, , ahk_id %CntHwnd%
return

;ファイルダイアログ
#IfWinActive ahk_class #32770
^n::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30211, 0, , ahk_id %CntHwnd%
return
^m::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30212, 0, , ahk_id %CntHwnd%
return
^t::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30213, 0, , ahk_id %CntHwnd%
return
^s::
ControlGet, CntHwnd, hwnd, , SHELLDLL_DefView1, A
PostMessage, 0x111, 30214, 0, , ahk_id %CntHwnd%
return

 Vista以降はウィンドウ直接狙っても効果がなかったり、番号揺らいでたり、ややこしい。
 あと、WinGetでクラス名指定してもダメだったからControlGetでClassNN指定したけども、そういうもんなん? 正直7版は自信ない。まあウチでは動いてるからいいやー、っていう。XP版のファイルダイアログ操作も、7版を移植しただけなので同様。

 なお、いわば[右クリック>並べ替え]の操作を省略しているにすぎないので、「詳細表示の設定」から項目増やしたり順番いじるとずれる。

 Windows7のはグループ表示がONになってしまうことがあるようなので、グループ表示をOFFにするホットキーも作成。

^g::
ControlGet, CntHwnd, hwnd, , ShellTabWindowClass1, A
PostMessage, 0x111, 30210, 0, , ahk_id %CntHwnd%
return


[PR]
by lordnoesis | 2011-06-13 00:11 | Trackback | Comments(0)

AutoHotKeyで、Operaの起動をより便利にしてみた。

 マスターパスワード入力ダイアログをアクティブにしてみたの発展版。

 前回のOpera終了時に大量のタブ開いてたけど、そのセッションは残しつつ、まっさらなOperaを起動したいなーと思ったのでやってみた。はじめStringGetPosとStringMidでセッションファイル解析してたんだが、よく考えたら標準INI形式だったんでIniReadでよかったっつー……。

 「はい」で普通に起動、「いいえ」で最終セッションを現在日時でリネーム。起動時のマスターパスワード入力ダイアログをアクティブにする機能もあるよ! AHKスクリプトにマスターパスワードとか記入するなよ! 絶対するなよ!

#WinActivateForce
  SessionsPath := "セッション保存先のパス"

  IniRead, WinCnt, %SessionsPath%autosave.win, session, window count
  if("ERROR" != WinCnt)
    GoSub, SessionAnalyze

  run, Opera.exeのパス, , , OpPid
  OpTitle := "パスワード"
  WinWaitActive, %OpTitle% ahk_pid %OpPid%, , 20
  if(ErrorLevel != 0)
    Exit
  WinWaitNotActive, %OpTitle% ahk_pid %OpPid%, , 20
  WinActivate, %OpTitle% ahk_pid %OpPid%, , 20
Exit


SessionAnalyze:
  loop, %WinCnt%
  {
    IniRead, HisCnt, %SessionsPath%autosave.win, %A_Index%history title, count
    if("ERROR" == HisCnt)
      Continue
    HisCnt--
    IniRead, WinTitle, %SessionsPath%autosave.win, %A_Index%history title, %HisCnt%
    WinTitles := WinTitles " " U2A(WinTitle) "`n"
  }
  if("" == WinTitles)
    return

  MsgBox, 3, 表示後30秒で強制的に起動します。, 最終セッションを退避せずに起動しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, 30
  ifMsgBox, No
  {
    TimeNum := A_Now
    FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%.win
    if(0 < ErrorLevel)
    loop
    {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%TimeNum%_%A_Index%.win
      if(0 == ErrorLevel)
        Break
    }
  }
  ifMsgBox, Cancel
    Exit
return


; ↓encutil.ahk(http://yak3.myhome.cx:8080/junks/index.html#afx.afxscript)由来
U2W(ByRef result, str)
{
  len := DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0, "Str", str, "Int", -1, "UInt", 0, "UInt", 0)
  If len > 0
  {
    VarSetCapacity(result, len * 2)
    DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0, "Str", str, "Int", -1, "Str", result, "UInt", len)
  }
}

W2A(ByRef str)
{
  len := DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0)
  If len > 0
  {
    VarSetCapacity(result, len)
    len := DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "Str", result, "UInt", len, "UInt", 0, "UInt", 0)
  }
  return result
}

U2A(str)
{
  U2W(t, str)
  result := W2A(t)
  return result
}

 これをrun_opera.ahkとか適当に保存して実行するだけ。

 セッション保存先のパスは「ヘルプ > Operaについて」の「保存されたセッション」でわかる(ファイル名までは書かないように)。
 AHKのダメ文字対策はしてない。起きてもダイアログの表示が欠けるだけだから気にすんな!(えー。


 おまけ。

#IfWinActive ahk_class OperaWindowClass

  F1::^w
  F2::^+Tab
  F3::^Tab


[PR]
by lordnoesis | 2011-05-21 13:59 | テクノロジ | Trackback(1) | Comments(0)
ブログトップ | ファンになる