ZOOMアプリ用リモートWEBサービスの動作説明
フリーウェアとして紹介したZoomCtrlプログラムもだんだん安定してきたので,ここでは内部でどういう動作をしているのか紹介したいと思います。
まずは,WindowsプログラムはWindowハンドルの検索が大前提。ZOOMアプリは多くのWindowの集合体だから,ステータス取得も含めてそれらのWindowのコンテンツを外部プログラムから確認できて初めてそのコントロール機能が実現できます。ホットー・キーのエミュレーションをするためのVirtual Keyコードをキー入力を受け付けるWindowに送出するのもそんな機能の1つです。
一番面倒なのは,マイクやビデオのON/OFF状態などをどうやって知るかということです。ZoomのAPIを使えばZoom会議の状態は簡単に取得できますが,多くの人にフリーウェアとして使ってもらうためにはサブスク料金のかかるAPIサービスを利用する訳にはいかない事情があります。なので,Zoomアプリのコントロールパネルのアイコンの状態からプログラム自身で判断する必要がありました。
ここで重要になるのは,任意のWindowコンテンツの中から特定のアイコンが存在するかどうかをプログラムから確認する方法をどうするかです。なるべく比較のための計算を簡略化して高速化を図る必要がありますが,当然のことながら1ドットずつチェックすることはできませんし,Zoomアプリのアイコンそのものが更新されていく可能性も考慮します。そのために比較したいアイコンのビットマップをグレー画像に変換後,dHashと言う隣接するピクセルの輝度の差分を比較することによるハッシュ計算方法を使いアイコン固有の数値を導き出しています。
スキャンするWindowコンテンツからも同サイズのビットマップを取ってきて同様にハッシュ計算し,次にその互いのハッシュ値の違い(ハミング距離)を計算してアイコンの類似度が判定できることになります。いろいろ面倒なのは,計算時間を短くするためにどの程度までビットマップの解像度を落としても精度の良い類似度判定ができるかということでしたが,これは実際にいくつかのアイコン・サンプルで実験してみないとわからないことでもあり,実装にはかなり時間がかかりました。解像度を落とし過ぎると,アイコンAでは類似判定が成功してもアイコンBの類似判定では失敗することが起きたからです。
ちゃんと判定ができるようになると,次はHTTPサーバーを実装してスマホ側に各種ステータス状態を通知したり,ユーザーのボタン操作を検出してJavaScript経由でホットキーの送出につなぐことになります。C#コードのテーブルにJavaScriptコードやHTML構文を埋め込んでHTTPレスポンスとして返すのは普段はあまり実装しないケースですが,なかなか楽しいオール・イン・ワンの埋め込みコード開発でしたね。
ここまでで基本機能はだいたい動くようになっても,実は上述のZoomのステータス判定のためのアイコン類似度計算にはまだ大きなハードルがあります。ZoomユーザーのPCの画面解像度は一律ではないので,予め用意したアイコン・サンプルとZoomのWindowコンテンツから得られるアイコン・イメージには倍率差があったりします。そのため動作PCの画像解像度に合わせた適切なビットマップ・イメージのスケール変換を行ってからアイコンの類似度を比較する必要があるということです。この実装を行って初めて数多くのPCユーザー環境に適合することになったといえるでしょう。プロトタイプまででもなかなか大変でしたが,色々試行錯誤をしたら結局さらに2か月位かかってしまいました。
以上がZoomCtrlアプリの簡単な動作説明でした。やっとコードが安定してきたようなので,そろそろ次のソフトの構想でもしてみようと思います(笑)
最新版のダウンロードはこちらからです。
ZoomCtrlの開発過程はとても興味深いですね。特に、アイコンの類似度を計算するための方法は独自の工夫が詰まっています。APIを使わずにフリーウェアとして提供するために、様々な技術的課題を乗り越えたことがわかります。また、解像度の違いを考慮しながら動作させるのは大変だったでしょうね。このアプリはどのようにしてユーザーの画面解像度に合わせたスケール変換を実現したのですか?
コメントありがとうございます。ご質問の件ですが,Zoomのメニューアイコンは単一のリソースセットを使用しているみたいなので解像度に合わせてアイコンサイズが勝手に変化します。なので,例えば1920×1080の時のアイコンサイズを標準として現在のアイコンサイズをいったんそのサイズに変換してから類似度のチェックを行います。そうすることで単一のロジックで類似度のチェックを行えるので,各種Zoom設定のON/OFFの判断ができるようになります。
ZoomCtrlの開発過程はとても興味深いですね。特に、アイコンの類似度を計算するための方法は独自の工夫が詰まっています。APIを使わずにフリーウェアとして提供するために、様々な技術的課題を乗り越えたことがわかります。また、解像度の違いを考慮しながら動作させるのは大変だったでしょうね。このアプリはどのようにしてユーザーの画面解像度に合わせたスケール変換を実現したのですか?
質問が重複していますので,
上記のadminコメント( https://mhsoftwaredesk.com/2022/08/how2work/#comment-154 )をご参照ください。