- 作品名:
- 「
HELuPER! 」 - 作者名:
- はりまお
- 制作環境:
- Core i7-4770 3.40GHz + 8GB RAM
- Windows 10 Pro (64bit)
- 開発言語:
- Visual Basic 2010 Express Edition SP1
- 動作環境:
- .NET Framework 4 Client Profile
- 形態種別:
- フリーソフトウェア(オープンソース)
Visual Basic 中学校さんの「投稿プログラム」コーナーにて掲載していただいております。(2014年01月11日〜)
Vectorさんにも掲載しています。(2015年08月11日〜)
名前 | バージョン | 概容 |
---|---|---|
HELuPER.exe | 1.11.0.2 | 実行ファイル |
Readme.txt | 説明文(本文と同じ) | |
CreateNote.txt | 制作履歴 | |
Lupe_Pygmy | ソース コード等 (不要なら削除可) |
マウスカーソル(マウスポインタ)を避けながら、その周辺を拡大するミニルーペです。
一般的なルーペ(拡大鏡)は、画面の一部を占有したり、ウィンドウが作業領域の一部を覆い隠したり、といった欠点がありました。この問題を緩和する作者の試みが、「自動的にマウスカーソルを避ける」でした。
ドット単位での作業を行ったり、画面上のピクセルの色を調べたりするための道具として、なるべくコンパクトで邪魔にならないことを主題にしました。よって、小さい文字を読むといった老眼鏡的用途には不向きだと思います。
本作を使用するためには、『.NET Framework 4 Client Profile』(『.NET Framework 4』または『.NET Framework 4.5』でもおそらく動作可)が必要です。.NET Frameworkの導入方法には、いくつか方法があるようなので、ネットで調べてください。
Windows8.1での例を簡単に書くと、[コントロールコントロール パネル]-[プログラム]-[Windows の機能の有効化または無効化]で表示される一覧から、該当項目にチェックをつけるようです。
本作は、インストール・アンインストールともに特別な作業を必要としません。適当な場所に作成したフォルダにダウンロードした圧縮ファイルの中身を解凍すれば使用できます。不要になれば、そのフォルダごと削除するだけです。
レジストリの変更やインストールフォルダ以外へのファイル作成といった行為は、一切していません。
アップデートは、全てのファイルを上書きします。設定ファイル・記録ファイルの互換性を必ずしも確保していないため、削除して再設定するのが確実です。
起動は、"HELuPER.exe"を実行するだけです。起動すると、タスクトレイ(通知領域)にアイコンが登録され、“ビューア”と“情報パネル”が現れます。
終了するには、タスクトレイアイコンを右クリックしてメニューを開き、
を選択してください。ビューアには、マウスカーソルが指し示す場所(これを“注目点”と呼びます)の周辺が拡大表示されます。マウスカーソルは映りません。
ビューアは、マウスカーソルが近づくと回避します。回避方法には、以下の種類があり、設定コンソールから選択できます。
タスクトレイアイコンをクリックするたびに表示/非表示が切り替わります。タスクトレイアイコンの右クリックメニューの[隠す]でも同じことができます。また、Shiftキーで一時的に透過させることもできます。
もちろん、情報パネルも同様になります。
ビューアの最大サイズは、画面の解像度によって制限されます。指定されたサイズがこの範囲内になければ、自動的に調整されます。調整されている場合は、拡大画像の周辺に薄く黄と黒の帯が表示されます。
ビューアに引っ付いて、注目点に関する情報を表示します。設定コンソールにて、以下の表示形式から選択できます。
名称 | 形状 | 【色】 | 【絶対座標】 | 【相対座標】 | 【補助情報】 | 概要 | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
ARGB | A | R | G | B | スクリーン全体 | 各画面内 | 角度 | 距離 | ||||
〔みたらし団子〕 | ![]() |
× | ◎ | ◎ | ◎ | ◎ | ○ | ○ | ○ | ○ | ○ | 全ての情報を表示します。 |
〔若あゆ〕 | × | ○ | ○ | ○ | ○ | ○ | ○ | △ | ○ | ○ | 〔みたらし団子〕の縦幅を抑えたものです。 | |
〔きんつば〕 | × | × | ○ | ○ | ○ | ○ | × | △ | △ | △ | 〔若あゆ〕の横幅を抑えたものです。 | |
〔八つ橋〕 | ![]() |
◎ | × | × | × | × | × | × | △ | × | × | 必要最低限の情報のみに絞って、簡略表示します。 |
〔五色豆〕 | × | △ | △ | △ | △ | × | × | △ | × | × | 〔八つ橋〕を2段にし、横幅を抑えたものです。 | |
概要 | 注目点の色のARGB値を表示します。 △…10進数表記がなくなります。 ◎…色に合わせて背景色が変化します。 |
スクリーン全体や各画面内での注目点の位置を表示します。 | コマンドパッドで指定した基点から見た注目点の位置を表示します。 △…基点座標が表示されません。コマンドパッドで確認できます。 |
基点と注目点が成す角度と距離を表示します。 値は、四捨五入されます。 角度は、3時方向を0度とし時計回りに計測します。 △…小数点以下がなくなります。 |
情報パネルは、マウスカーソルとビューアの位置関係によって移動します。
コマンドパッドは、指呼キーを押している間だけ現れ、様々な機能を使用できます。指呼キーは、設定コンソールで割り当ての確認と変更ができます。ちなみに、基底で割り当てられている[LWin]とは、左側のWindowsキーのことです。
※コマンドパッドを表示しいる間、注目点・ビューア共に更新されません。拡大画像の縁が暗く表示されます。コマンドパッドには、以下の機能が並んでいて、クリックで使用します。
〔起点直行〕 | ![]() | マウスカーソルを画面の左上隅に移動します。 |
---|---|---|
〔基点一足飛〕 | ![]() | マウスカーソルを基点に移動します。 |
〔基点登録〕 | ![]() | 現在の注目点を基点として登録します。 |
〔拡大画像複写〕 | ![]() | 拡大された画像をクリップボードにコピーします。 |
〔色取得〕 | ![]() | 注目点の色(ARGB値)をクリップボードにコピーします。 |
〔RGB送出〕 | ![]() | 外部アプリケーションのRGB値入力欄に注目点の色を自動入力します。 |
〔注目点調整〕 | ![]() | 注目点を指定ドット分ずらします。 |
〔RGB送出〕は、キーボード操作を再現してR,G,Bの各値を外部のソフトに入力します。使用方法は、次の通りです。
〔注目点調整〕は、コマンドパッドを閉じた時に反映されます。直接キーボードから、数値を入力することはできません。
ダイレクトキーでは、キーの組み合わせで、マウスカーソルを1ドットずつ動かしたり、ビューアの拡大画像をクリップボードにコピーしたりできます。キーの割り当ては、設定コンソールで確認と変更ができます。
設定は、タスクトレイアイコンを右クリックすると現れるメニューの[設定]から行います。
設定項目の説明は、タイトルバーにある
をクリックし、続けて知りたい項目をクリックすると表示されますので、参考にしてください。変更した設定内容を適応したらどうなるかを確認できる“お試し”機能があります。お試し中は、拡大画像に黄と黒の帯が表示されます。
色書式は、.NET Frameworkの《String.Format》メソッドそのものです。詳細は、以下のサイト等を参考にしてください。ですが、プログラム経験者でなければ、かなり難解だと思います。申し訳ございません。
ソース フォルダを配布するに際して、"obj"フォルダを削除しています。
そのため、ユーザーコントロールを使用しているフォームのデザインを開くと、エラーになります。
そこで、初めてプロジェクト(ソリューション)を開いたら、“ビルド”してください。これで"obj"フォルダが、作成されます。
フォームのデザインを開いてしまった場合は、ビルド後にプロジェクトを開き直すと正常になります。
"bin"フォルダに設定ファイルがある状態でデバッグ実行すると、イミディエイト ウィンドウに下記のエラーが表示される場合があります。
これは、設定ファイルに記述されている色コードの形式を、エラーによって判断しているためです。気にせず無視してください。
“ビューアの拡大画像表示部の縦または横の最大値”と“マウスカーソル接近許容距離(回避行動を始める距離)の最大値”の和が、“使用する画面(作業領域)の解像度の縦横の短い方の50%以下”に収まるように制限されています。
これは、回避時にビューアが画面からはみ出してしまったり、常にビューアに隠されてしまう領域ができたりなど、支障をきたさないようにするためです。
もし、画面設定を変更したり違う解像度の画面へビューアが移動したりして、最大サイズに収まらなくなった場合は、表示可能な値に調整されます。これは、一時的な処置で設定値を変更するものではありません。再び十分な解像度になると元に戻ります。
とにかく“邪魔にならないルーペ”を実現したくて、マウスカーソルを回避する方法を考えました。外部から得ている情報は、“使用クライアント領域”と“マウスカーソル位置”だけです。
手始めに、画面の四隅をグルグルする〔画面四隅のすれ違い〕を作りましたが、そこにはウィンドウの操作項目やステータスバーがあったりするので、それらを隠してしまうこの方式だけでは少々難がありました。
そこで、重要度が低そうな画面中央を横断する〔画面中央の右往左往〕や、マウスに寄り添って視線移動を小さくする〔画面の中の金魚〕を追加しました。しかしながら、眼前を行ったり来たりされるのは意外と目障りでした。
これだけやってもダメならばと、通常ウィンドウと同様の〔手取り足取り〕も追加してしまいました。いやいや待て待て、これでは自動回避の理念がないがしろになっているではないか。
心を入れ替え、静と動の折衷案として、基本的には画面右端中央に居てマウスが近づけば上下に逃げる〔画面右の三角関係〕を設けてみました。
という具合に、簡単に実装できそうな機能を盛り込んできましたが、もっとデキる人ならばもっともっと格好いい回避を実現できるでしょう。妙案があれば改造してみてください。
もし、作者がデキる人であったなら、水に浮かぶ油のようにヌルンッと回り込むような感じを再現したり、軌跡が自然なカーブを描くようにしてみたいですが、絵に描いた餅です。
このファイルには、設定内容が保存されます。設定コンソールの[OK]ボタンを押して確定すると、実行ファイルと同じフォルダに作成されます。
このファイルには、設定コンソールから変更できない項目が含まれています。その項目の詳細は、“○資料”⇒“《表1》”の通りです。
XML形式のテキストファイル(UTF-8)なのでテキストエディタで変更可能です。ただし、大文字と小文字を区別するので、書き換えには十分注意してください。
このファイルには、〔手取り足取り〕モード時のビューアの表示位置と基点座標が保存されます。変更があれば、本作が終了するときに、実行ファイルと同じフォルダに作成されます。
初期化したいときは、このファイルを削除してください。
APIの《GetAsyncKeyState》を使ってキーのON/OFF状態を監視しています。
.NETにキーの状態を取得する機能はなさそうなので(Shift,Ctrl,Altなら捕捉できるけど)、最初は《KeyDown》/《KeyUp》イベントの組み合わせで対処しようと思っていました。しかし、ルーペとは他のアプリケーションの補助的存在ゆえほぼ非アクティブ状態ですし、回避という特性上ユーザーがルーペをアクティブにするスマートな方法もありません。ルーペ自身の状況にかかわりなく操作できないと困るということで、結局APIに頼りました。(その代わり、他のアプリのショートカットキーとの重複という厄介な問題を抱えてしまうことになるのですが…)
長らくサボってきたけど、ダイレクトキーによるマウスカーソル移動操作での斜め入力をできるようにしてみたら、なかなかの曲者だった。
4方向時代のキー割り当ては、他のアプリケーションとの兼ね合いも考えて、あまり採用例を見かけないAlt+カーソルキー(方向キー)という組み合わせでした。
ところが、Alt+↑+←に反応してくれないのです(これが仕様なのか、制作環境固有の問題なのかは不明)。仕方なくCtrlキーに替えたものの、これはこれでテキストエディタ等で使用される組み合わせです。とは言え、本作をテキストエディタと共に使用するのは稀であろうし、Shiftより害が少なそうだから、「他に選択肢がない」と自分に言い聞かせて納得することにしました。(あぁ、斜め入力なんて欲を出すから…グスン、だってやりたいやん。)
どうしてもダメなら、カーソルキーを諦めてテンキーの2,4,6,8辺りにするなどしてください。
よく似た機能に、コマンドパッドの〔注目点調整〕とダイレクトキーの〔マウスカーソル移動〕があります。これらは、使用目的が異なります。
〔注目点調整〕は、現在の注目点から決まったドット数分だけ移動させたいときに向いています。〔マウスカーソル移動〕は、ビューアを見ながら目的のピクセル(座標)にマウスカーソルを合わせるのに向いています。
よく似た機能に、コマンドパッドの〔拡大画像複写〕とダイレクトキーの〔ビュー撮影〕があります。これらは、ビューアに表示されている拡大画像を取得する機能ですが、いくつか違いがあります。
〔拡大画像複写〕は、内部で拡大された画像そのものを取得します。よって、ビューアからはみ出している部分を含みますが、ガイド画像(背景・格子線等)は描かれていません。
〔ビュー撮影〕は、ビューアの画像を表示している部分を画像として取得します。そのため、表示部の枠やガイド画像が含まれます。
〔RGB送出〕は、《SendKeys.SendWait》メソッドを使用してキーボード操作を再現する仕組みです。
標準での再現手順は、Windows標準の“色の設定”ダイアログを想定し、以下のようになっています。ちなみに、手順9は、便宜上行っているだけであって、必須の操作ではありません。
もし、目的のアプリケーションに合わないなら、設定ファイルの<送出パターン>を書き換えてください。記述方法は、MSDNの「SendKeys.Send メソッド」の説明を参照してください。
送出パターン内に埋め込まれている "|ALPHA|","|RED|","|GREEN|","|BLUE|"(必ず大文字)は、それぞれA,R,G,Bの値(10進数)に置き換えられます。
送出パターンには、色書式用の要素を利用することもできます。ただし、この場合は《String.Format》用の記述となりますので、文字以外のキーの波括弧が二重になる点に気を付けてください。
16進数で出力したいなど、もう少し柔軟に運用したいなら、こちらを試してください(とはいえ、10進数が通じない状況がどれほど存在するのか…そもそもそのような環境でこんな拙作を使うだろうか?)。それでもダメなら、コードを改良してください。
^a{4:X}{{TAB}}^a{5:X}{{TAB}}^a{6:X}+{{TAB 2}}
Windows標準の“色の設定”ダイアログに使途を限定するなら、手順1をAlt+R("%r")に書き換えてR欄へフォーカスを移すようにすると、少し便利かもしれません。また、手順4,7の“全選択”を省いても問題ありません。
%r|RED|{TAB}|GREEN|{TAB}|BLUE|
実行ファイルと同じフォルダに"complete.wav"という名前でWaveファイルを置いておくと、コマンドボタンを実行した後に再生されます。これは、「了解しました」とか「完了しました」っていう手応えを感じたいという作者個人の欲求から設けています。もし必要でしたら、お手数ですがお好みのWaveファイルをご用意ください。
なぜ、Waveファイルを同梱していないかと言うと、お気に入りの音の提供元が“再配布禁止”でして、リソースを含め全てを公開する当方の方針ゆえ、それは“再配布”に当たるかもと思い諦めました。と言う訳で、紹介だけしておきます。「フリー効果音素材 くらげ工匠」)さんの「システム音・電子音」に収録されている“ボタン073”をあれこれ加工(フォーマット変換, 前後の無音部を削除, 倍速再生, 音量調整)して使っています。
ある日、ペイントを使っていて“ある点からある点へ直線を引こう”としたら、どうにも困ってしまった。その点にマウスカーソルを合わせるのは、非常に困難。ピクセルをはっきり狙えるまで拡大すると、対象の2点が1画面に納まらない。2点が見えるまで倍率を下げると、カーソルがどのピクセルを指しているのか分からない。なんとも歯痒い事態。昔愛用してたどのMSX用グラフィックツールにも、ミニルーペが付いてたんやけどなぁ。
もちろん、Windows(XPや8.1しか知らないけど)には、“拡大鏡”が標準で搭載されている…のだけれど、画面の一部を占有しちゃって作業領域が狭くなっちゃうのがいかんともしがたい(デスクトップのアイコンとかの配置が動かされちゃったりするのも許せない)。フリーのを探してみても、理想のタイプにはめぐり合えない。
「座標を覚えとけば済むやん」と言われればそれまでなんやけど、数桁の座標2点分で10桁前後なんて、記憶力の乏しい貧弱脳の作者にはお手上げ。「じゃぁ、メモっとけば」ってことになるけど、それはあまりにも面倒。
こりゃもう「自作しかないッ!!」よネ♪。
っていうか、そもそもドラッグで直線を引かすことが問題なんじゃないのかな。始点と終点をそれぞれクリックさせてくれれば、途中で画面をスクロールしたり倍率を変えたりできるわけで、全て解決しちゃうのに。画像を拡大する方式と直線を引く方法がチグハグなんだよなぁ!
情報パネルや回避の名称がヘンテコなのは、どんな名前にしたものかとあれこれ思案し過ぎてこじらしちゃった結果なので、気にしないで頂けると有難いです。一応、サイズ感とか動きをイメージしてみたんだけど…。
ダイレクトキーの他にコマンドパッドがあるのは、「キーの組み合わせを覚えられなくてイライラしちゃうから」っていう、貧弱脳なゆえの悲しい仕様なんだわ、これが。
それにしても、めぼしいキーの組み合わせは他で使われちゃってて、割り当てに困っちゃうよぉ。
ダイレクトキーのカーソル移動の割り当てがしっくり来ないがために、注目点調整機能を設けることになり、不細工なコマンドパッドになっちゃった。実行ファイルを肥大化させる原因にもなってる。どうせ肥大化しちゃうなら、注目点移動専用にパッドを分離して、ソフトウェアカーソルキーボードを作った方がスッキリするかもしれんなぁ。でも、さすがに面倒過ぎるよなぁ。
本作のプロジェクトは、VB2008で創っていたのを途中からVB2010にコンバートしているんだけど、新規作成したプロジェクトとコンバートしたプロジェクトでは何か違っている。自動で切り替わっていたビルド構成が手動になっちゃたり、対象フレームワークとか参照先は.NET〜4に差し替わっているのに、"〜.vbproj"ファイルには"3.5"って数字が残ってたり。これらをどう弄れば良いのかもよう分からんし。あぁ、スッキリせんわぁ〜。
2014年末、MicrosoftよりWindows XPの余命宣告を受けていたもんだから、デスクトップPCを8.1へ乗り換えた。
それに伴ってLCDも調達。期せずして夢のデュアルディスプレイ環境が手に入っちゃった。なもんで、喜び勇んで本作の開発もノートPCから移行してきてデュアルディスプレイ対応力向上を画策したものの、何とか力ずくで(ってほど力持ちじゃないけど)ねじ伏せてあった拡大鏡サイズやら回避やらが、全て矛盾や不都合となって噴出しちまった。トホホ。
この一件で、マルチディスプレイ環境への対応は「面倒である」と痛感した。やっぱり、PCの世界は、多様性・汎用性の高さゆえの代償が大きいのかな。賢い人達の知恵や技術を、おバカな頭で千差万別な状況を考えなくて済む方向に使ってもらえたら、うれしいんやけどなぁ。
それ以外にも、透過フォームの扱いとか、壁紙に透明色を発見とか、本作の核心に響く要改善個所がいっぱいあったりして(8.1どころかVistaの時点でダメだったってことか…)。もうね、タハハだよ。
そんなこんなで、永い永い試行錯誤とつじつま合わせの旅は、精神的にしんどい作業やったけど、知恵と勇気!(?)で乗り越えた(と思いたい)。いや〜、大変やった分だけ、何とかなった時の快感もひとしおや!
OSの乗り換えと言えば、拡大鏡の更新にかかる時間が、XPでは2ms程度だったのに対して、8.1ではその10倍以上ってこともざら。同じコードなのにナゼ(?_?)。世に言う「32bitより64bitの方が遅い」ってやつかねぇ? それとも《Stopwatch》クラスの精度の問題? いや、自分が書いたコードがショボイんですよ、きっと。
そうそう、8.1の拡大鏡を使ってみたら、画面全体をルーペにできて(拡大した画像で操作できる)ドット単位の操作がし易くなってたよ。でも、惜しいかな、ルーペとステータス欄の両立ができないから、現在のマウスカーソル座標とか図形を描こうとしている範囲とか、せっかく表示してくれていても見ることができない。今見ているのが全体のどの部分なのか分かりにくいとか、メニューやツールを使うにもいちいちスクロールしないといけないとか、あと一歩足りない感じ。
Vistaから“Magnification API”なる拡大鏡APIが提供されているらしい。これを使えば、もっと楽できたのだろうか?
いや待てよ、8.1の拡大鏡もこれを使って実現されているってことだよね。ってことは、たとえば、拡大鏡の全画面表示モードと同じ物を画面の一部だけに表示するとか、ディスプレイ1の表示内容をディスプレイ2に拡大するとか、そういうのが作れるんじゃないの? そうしたら、作業し易いルーペになるんとちゃうかなぁ。でも、肝心のAPIがどういう物で、どうやって使うのか、日本語の資料を一つも見つけられんかったよ、グスン。
アイコン用の48×48ドット画像は、“CUBE-GYM(キューブ ジム)”っていう立体ドット絵作成ツールで描いてみた。この CUBE-GYM は、まるでナノブロックのような可愛らしい3Dグラフィックが簡単にできてしまう(センスによりますが)、とても面白いソフト。なのに、更新が途絶えてしまっていて、サイトも閉鎖されている。ってことは、会社自体に何かあったのかな? もっともっと改良を重ねて欲しかったんやけど、もったいないよなぁ。かと言って、自分が手を出せるほど3Dは甘くないしなぁ。残念だわぁ。
<HELuPERの設定内容>-<ビューア>-<マーク>-<副色> |
|
意味 | 影の色を生成するためのパラメータを指定します。 |
---|---|
値 | ARGB(16) または 色名 |
初期値 | aa3f3f3f |
<HELuPERの設定内容>-<ビューア>-<サイトX> |
|
意味 | 斜め方向のサイトを表示するかを指定します。 |
値 | Boolean型 |
初期値 | True |
<HELuPERの設定内容>-<ビューア>-<下地模様> |
|
意味 | 下地に描く模様を指定します。 |
値 | 《HatchStyle》列挙体 |
初期値 | ForwardDiagonal |
<HELuPERの設定内容>-<操作キー>-<Shift不透明度> |
|
意味 | シフトキー押下時のビューアの不透明度を指定します。 |
値 | Double型 0.0以上 1.0以下 |
初期値 | 0 |
<HELuPERの設定内容>-<操作キー>-<Ctrl不透明度> |
|
意味 | コントロールキー押下時のビューアの不透明度を指定します。 |
値 | Double型 0.0以上 1.0以下 |
初期値 | 1 |
<HELuPERの設定内容>-<操作キー>-<Alt不透明度> |
|
意味 | オルトキー押下時のビューアの不透明度を指定します。 |
値 | Double型 0.0以上 1.0以下 |
初期値 | 1 |
<HELuPERの設定内容>-<コマンドパッド>-<不透明度> |
|
意味 | コマンドパッドの不透明度を指定します。 |
値 | Double型 0.1以上 1.0以下 |
初期値 | 1 |
<HELuPERの設定内容>-<コマンドパッド>-<色書式>-<規定書式> |
|
意味 | 既製のARGB値取得用書式として登録する分だけ列挙します。 |
値 | String型 《String.Format》メソッドの書式に規準 |
初期値 | {3},{4},{5},{6} |
<HELuPERの設定内容>-<コマンドパッド>-<送出パターン> |
|
意味 | 外部ARGB欄へ送信するキーストロークを指定します。 |
値 | String型 《SendKeys.SendWait》メソッドの《keys》パラメータに規準 |ALPHA|,|RED|,|GREEN|,|BLUE|(必ず大文字)は、それぞれA,R,G,B(10)に対応 |
初期値 | ^a|RED|{TAB}^a|GREEN|{TAB}^a|BLUE|+{TAB 2} |