をるふちゃんのブログ

めもっぽいやつ

Chrome上でホイールを回してつい拡大縮小しちゃう問題を解決する

発端

Chromeを使いこなす諸兄におかれましてはCtrl + W でタブを閉じたり、Ctrl + Tでタブを新しく作ったりする方がたくさんおられるかと思いますが、
タブを一気に閉じるとき記事をざっと流し読みして(ホイールを回して)閉じるかどうか検討するときにうっかりCtrlに触ってたり、そうでなくても操作の最中にうっかりマウスホイールに触ると

拡大縮小 してしまう

ことはございませんでしょうか???

そのたびに歯噛みしてゆっくりゆっくりマウスホイールを回す(反応が遅いので様子を見ながら100%に戻るまで回す)か、
アドレスバーにある虫眼鏡のマークを押して「デフォルトに戻す」をクリックすることと思いますが、そもそもマウスを動かして「デフォルトに戻す」まで持っていくのがダルい!しかもあのポップアップすぐ消えちゃう。 Ctrl + 0を押してもいいけどマウスから手を離して0に指を置くのが面倒くさい。

ということで無効化したいと思った次第。
だってCtrl + [+/-]で拡大縮小できますし。

Chromeの設定

Chromeの設定にホットキーって無いんですね、びっくりしました。
そういえば以前「Backspace」を押すとブラウザバックしてしまうのを阻止できないと嘆いた記憶があったりなかったり。

Chromeウェブストアの拡張機能

探してみました。いかにも怪しげな拡張機能で無効化できそうなことが書いてありましたが、私の環境では できません でした。Chromeはバージョン更新激しいですしね。対応しなくなったのかも。

というわけで前置きが長くなりましたが

AutoHotKeyというアプリケーションを入れることにしました。
かいつまむと、WinAPIのメッセージを監視できるアプリケーションで、任意のキー押下に反応して様々な動作をスクリプティングできるというおしゃれなソフトみたいです。

導入~設定まで

サクッとインストールしちゃってください。
私はインストールオプションには全部チェックを入れましたが、なくても動くかもしれません。

続いて、邪魔にならなさそうな任意のディレクトリに以下のようなスクリプトを書きます。

#IfWinActive ahk_class Chrome_WidgetWin_1
^WheelDown::
Send, {WheelDown}
return
^WheelUp::
Send, {WheelUp}
return

拡張子は.ahkです。chrome_WheelBlock.ahkとでも命名しておきましょう。
これを保存してダブルクリックするとスクリプトが裏で動き始めます。
タスクトレイアイコンに「H」のアイコンが出ていれば大丈夫でしょう。

親切なことに、スクリプトに文法エラーがあった場合エラーダイアログを吐いてくれるし、既存のスクリプトを編集した場合、置き換えてよいか?というダイアログが出たりします。

せっかくなのでスタートアップに登録しておきましょう。
C:\Users\任意のユーザーアカウント名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup このあたりにそのディレクトリがある気がするので、ショートカットを作ってそこに放り込んでおけば、Windowsの起動時にそのスクリプトを実行(開始)してくれます。

とりあえずこれでChromeアクティブの状態の時は Ctrl + Wheelをブロックしてくれます。

既知の問題

非アクティブ時

アプリケーションが非アクティブ時も、マウスがChromeの上に載っていればWindows10ではマウスイベントが送信されます。
これはこのスクリプトでは解消できません。

(ここからは面倒な話になります)
このアプリケーションはWindowメッセージを監視して処理していますが、実装上(あとスクリプトの文法的な限界もあって)非アクティブウィンドウにメッセージを投げるのが簡単ではありません。
スクリプト書いてみたのですが、Chromeのウィンドウクラス(Chrome_WidgetWin_1)に送られるウィンドウメッセージのうち0x020A(マウスホイール操作)だけを捕捉してそれをブロックするいい方法がこのAutoHotKeyの関数には用意されていませんでした。
任意のdllを呼んで結果を取ってくる関数があったので、user32.dllGetClassNameを使ってむりくりなんとかなるかもしれませんが、それをやるくらいなら多分自分でアプリケーション書いたほうが早いかも…。
ということで棚上げ。

Chrome非アクティブ時にマウスが乗った状態でCtrl + Wheel操作を行ってしまった」という状況は、前述のCtrl+WやTの誤動作に比べれば遥かに少ないので誤差の範囲かなと思ってここはひとつ。

それを踏まえた上で、先のスクリプトの一行目の#IfWinActive#IfWinExistに書き換えると、Chrome(Chromium)のアプリケーションが1つでも存在している間はCtrl + Wheelをブロックするように動作させることができます。

さらにいうと、一行目をまるっと消して恒久的にCtrl + Wheelをブロックしてしまうのも手かもしれません。
他アプリケーションでもCtrl + Wheelの誤動作はそこそこあると思いますし、タスクトレイアイコン右クリックしてPause Scriptをすれば済む話ですし。

他のキーとの組み合わせ

今回のスクリプトではCtrl + Wheelをブロックしていますが、その2つに加えてAltかWinかShiftキーを一緒に押すと従来通り拡大縮小が行われます。
というのも文法規則で「^を先頭につけるとCtrlを付け加えるとみなす」とあるわけですが、+がShift、!がAlt、#がWinキーとそれぞれ対応しており、組み合わせた際の動作はそれぞれ別になっているようなのです。
ですからある意味「Ctrl + Wheelを完全に止めてしまってもAltあたりのキーを追加で押せば従来通り拡大縮小されるという仕様」と捉えることもできますね(誤動作しにくくなったのは良いこと)。

他アプリケーションでの動作

今話題のギフハブ製のテキストエディタ:AtomChromiumベースらしいです。
このスクリプトではウィンドウクラス名を判定してWheel回転を検知しているのですが、Spyで調べたらAtomのウィンドウクラス名もChrome_WidgetWin_1だったので同じように作動します。
移植する際にウィンドウクラス名くらい変えておけよって思うんですけど。

おきまりのやつ

なお、この記事を利用して(中略)

  • 事故っても関知しない、自己責任で
  • いやこれ動かない、とか言われても困るけど、気が乗ったらサポートするかもしれない
  • 導入できないとか気合でなんとかして。

以上!