IE9ピン留め

AutoHotKeyで「音量ミキサー」を呼び出して最大化してみた。

 WindowsVista以降、アプリケーションごとに音量を指定できるようになり、それにあわせてボリュームコントロールも「音量ミキサー」として生まれ変わったのだが、これが実に使いにくい。開いた直後は3つのアプリケーションしか表示できない程度の大きさで、しかもウィンドウを広げても記憶しない。

 まあ要するにウィンドウサイズいじるのを自動化すればいいだけなので、AHKでやってみた。

#V::
  run, SndVol.exe
  winWait, 音量ミキサー, , 10
  if (1 == errorLevel)
    return
  winGetPos, , , , WH, 音量ミキサー
  winMove, 音量ミキサー, , 0, A_ScreenHeight - WH, A_ScreenWidth
return

 スクリプト呼び出すなり、ホットキー割り当てるなり、適当に。

 話は変わるが、音量ミキサーの最大の問題は、ボリューム指定の方法。ボリュームには大きく分けて音声デバイスのボリュームと、アプリケーション毎のボリュームがあって、例えばデバイスを増減させた時はアプリケーションの方は割合で増減する(デバイスを100→50にした時、appAは100→50、appBは50→25)。一方、アプリケーションをデバイスより上げると、デバイスも一緒に上がるが、ほかのアプリケーションのボリュームはそのまま。なにこれ。
 こんなややこしい挙動にするなら、アプリケーションのボリュームの方は最初から「現状の音量に対する割合」にすればよかったのに。

# by lordnoesis | 2012-01-31 17:57 | テクノロジ | Trackback | Comments(0)

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

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

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

; -------- --------- --------- --------- ---------
; OperaSession2Bookmarks.ahk
; -------- --------- --------- --------- ---------

  BookmarksPath := "C:\Opera Next\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  IfNotExist, %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, 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 == 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"

    FileAppend, %Result%, %BookmarksPath%, CP65001  ; bookmarks.adrに直接書き込む

;    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への福音(えー。

# 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
]

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

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

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

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



More
# 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も考慮するとややこしくなるので妥協。

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

# 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対応になるが、別に困ってないのでいいやっていう。

# by lordnoesis | 2011-10-28 23:43 | テクノロジ | Trackback(1) | Comments(0)
< 前のページ次のページ >
トップ | ファンになる
【PR】これから販売予定の
新築マンション特集

XML | ATOM

skin by excite