Surface Laptop +デュアルディスプレイ環境のための AHK スクリプトを書いた

執筆日時:

f:id:daruyanagi:20170821161957j:plain

今日は重い腰を上げて、たまっていたタスクをいっぺんに片づけた。

ついでに、Surface Laptop +デュアルディスプレイ環境をより使いやすくするための AutoHotKey スクリプトをしこしこ書いてた。慣れないからやたら時間かかったけど、だいぶ使い勝手が上がった気がする。

マルチモニター環境でウィンドウを移動する

Windows 10 では[Windows]+[Shift]+[→]キーや[Windows]+[Shift]+[←]キーで“アクティブウィンドウを隣のモニターへ移動”できるのだけど、このショートカットを押すのがめんどくさい。Surface Laptop のキーボードには、右[Windows]キーがないので、どうしても両手を使う必要がある。

f:id:daruyanagi:20170826202400p:plain

というわけで、右側の[Shift]キーをと矢印キー(要するにキーボードの右下らへん)だけで移動できるようにした。

>+Right::Send,{RWin Down}{RShift Down}{Right}{RShift Up}{RWin Up}

[Windows]+[Shift]+[→]キーは#+Rightと書けると思ったのだけど、それではうまくいかないみたいで、解決策を探すのにだいぶ時間を食ってしまった。でも、おかげでアクティブウィンドウを片手でほいほいモニター移動できるようになった。要らないウィンドウはポイだ!

ドックに接続せずに使うときは仮想デスクトップをバリバリ使う

さて、ドックから外したときは画面が一つになってしまうので、代わりに仮想デスクトップをバリバリ使いたいよね。でも、仮想デスクトップ関連のホットキーも[Windows]キーを使うので、同じような問題に直面してしまう。というわけで、これも右手だけで行えるようにしてみた。

; Virtual desktop (Left Move)
>!Left::Send,#^{Left}
AppsKey & Left::Send,#^{Left}

; Virtual desktop (Right Move) >!Right::Send,#^{Right} AppsKey & Right::Send,#^{Right}

; Virtual desktop (Create) >!Up::Send,#^d AppsKey & Up::Send,#^d

; Virtual desktop (Delete) AppsKey & Down::Send,#^{F4} >!Down::Send,#^{F4}

右[Alt]キーと

  • [→]キーで次の仮想デスクトップへ切り替え
  • [←]キーで前の仮想デスクトップへ切り替え
  • [↑]キーで仮想デスクトップの作成
  • [↓]キーで仮想デスクトップの削除

に割り当ててみた(右[Alt]キーの代わりに[Apps]キーも使える。どっちにするか迷ったので、両方とも使えるようにした)。実は MacBook(BootCamp)は三本指ジェスチャーが使えないので、日頃から似たような AHK スクリプトを書いて使っている。

blog.daruyanagi.jp

それに操作感が似ているので、個人的には割と使いやすい(慣れちゃったんだよね)。タッチパッドを三本指だの四本指だのでスワイプするよりも楽だと思うし(たまにミスるし、Surface Laptop のタッチパッドは Mac に比べると少し狭い)。

f:id:daruyanagi:20170826200522p:plain

あと、仮想デスクトップを使うならおすすめの「SylphyHorn」も入れた。仮想デスクトップの番号を出したり、アクティブウィンドウを隣の仮想デスクトップへホットキーで飛ばしたり、仮想デスクトップの切り替えをローテーション(最後だったら最初に戻す)してくれる。

forest.watch.impress.co.jp

ストアで配布されてるのも素晴らしい……。

www.microsoft.com

さっき書いた「ほかのモニターへアクティブウィンドウを移動させる」機能は、ドックにつないでいないときは無駄なので、代わりに「SylphyHorn」の機能で隣の仮想デスクトップへ飛ばしてみるようにしてみた。

IsMultimonitor()
{
sysget, cnt, MonitorCount
return cnt > 1
}

; Move to next monitor (とりあえず右の場合だけ) >+Right:: if IsMultimonitor() { Send,{RWin Down}{RShift Down}{Right}{RShift Up}{RWin Up} } else { Send,{LWin Down}{LCtrl Down}{LAlt Down}{Right}{LAlt Up}{LCtrl Up}{LWin Up} } return

コンテキストによって挙動が違うのはあまりよくないかもしれないけど、自分の中では「邪魔なウィンドウをほかのモニター or デスクトップに飛ばす」という点では大して変わりがないので、あんまり混乱はないかも。

せっかく書いたスクリプトなので、なくさないように GitHub で管理。バイナリもあるので、もしほしい人がいたら使ってください(ほかの人にとって使い勝手のいいものかどうかは知らんが……)。

github.com