UI Automationを使ってTeams会議のミュート切り替えするプログラムを書いて、キーボードのGキーに割り当てた話
読まなくてもよい背景
僕はロジクールのG613というキーボードを使っています。
(公式サイトへのリンクを張りたいのに、公式の商品ページが見つからない。Amazonの在庫も補充される気配もないので、多分既に生産終了してる。)
- デカい
- そのくせパームレストが外せない
以外は良いキーボードです。
G613の圧倒的によいところは左端にあるGキーという、G HUBというロジクールのアプリで色々と機能を割り当てられるキーがあるところです。
(GキーはG915などにもあるので、G613独自の強みではない)
僕的に一番いい使い方はdiscordのミュート切り替えです。
ワンクリックでミュートにできるので、離席する時とかくしゃみが出そうな時とか、トイレで離席する時とかに重宝します。
で、僕はTeamsで通話することがあるのでTeamsのミュート切り替えも割り当てたかったのですが、G HUB上に公式でTeamsに関するキー割当の機能は提供されていません。
(どうやらTeamsがそういうAPIを提供していないらしい)
ただ、Gキーにはexeとかの実行も割り当てることができるので、ほな自分でTeams会議をミュート切り替えするプログラムを作ってやろうというモチベーションで作りました。
本編
当然動作やらなんやらは保証しません。ここからは君の目で確かめてくれ。
プログラムのざっくりしたフローは以下。
- EnumWindowsでTeams会議のウィンドウとミュートボタンを探す
- ミュート状態を切り替える。
- ミュートしたか、ミュート解除したかに応じた効果音を鳴らす。
以下がソースコードです。
(プロジェクト作るところは色々あったので端折ります。)
Program.cs
TeamsMeetingWindow.cs
SoundPlayer.cs
Logger.cs
GitHub copilotとネット上の記事を参考にしつつ、試行錯誤しながら書いたものです。
コード上のファイルパスとかはいい感じにしてください。
僕は.NET 10で作ったんですが、この環境でUI Automationを使うには色々と注意点があって、
- 参照マネージャーからUIAutomationClientとUIAutomationCoreを追加する
- csprojにUseWPF Trueを追加する
が必要っぽいです。
SoundPlayer.csではWindowsMediaPlayerを使用しているので、これも参照マネージャーから参照を追加してください。
個人的な好みでログにはjson形式で出しているので、NewtonSoft.jsonを使っているので、nupkgマネージャーで参照を追加してください。
ミュート時、ミュート解除時のSEは、僕は効果音ラボで拾ってきてミュートはボタン・システム音[1]のキャンセル4、ミュート解除は決定ボタンを押す42にしました。
TeamsMeetingWindow.csの動作は、当然のようにTeamsの仕様に依存しているので、Teamsのバージョンが上がってボタンが増えたり減ったりすると動作しなくなる可能性があります。その時は僕がこれを書いた時同様に、UIElementをJsonconvertしてログに吐いて、目当てのボタンに合わせてコードを修正してください。
追記
はてなブログでソースコード書くときってどうやるのがいいんだろ。
今回はVSCodeからコピペしてみたが。
*1:hWnd, iParam) =>
クラウドセーブがないゲームのセーブデータの話
大体のアプリケーションは以下のパスのどこかにセーブデータを保存しています。
C:\\Users\(ユーザ名)\AppData
んでこれはゲームにおいてもそうなので、SteamなりEpicなりFANZAなりDLSiteなりで買ったゲームにクラウドセーブ機能がなかった場合、ここらへんのそれっぽいフォルダをOneDriveなりDropBoxなりのクラウドストレージサービスに手動でコピーすれば、別デバイスでも同じセーブデータでゲームができる。
僕の場合、普段はデスクトップでゲームしてるけど、実家帰るときとかはノーパソを持って帰るので、そのときにもFANZAで買ったサクラノ刻のセーブデータを引き継げて便利。
もちろん、ご使用は自己責任で。
beatmania INFINITASをインストールしたドライブの名前を変更したらアンインストールもできなくなった話
色々あってWindowsをクリーンインストールして、DドライブなしでEドライブにSSDがあって、そこにinfinitasをインストールした。
そのあと、DがなくてEなのがキモいので、Dドライブに割り当て直したら、Windowsの標準のアンインストールが通らなくなった。
仕方ないのでDドライブのソフト本体を削除して、プログラムのインストールまたは削除がブロックされる問題を解決する - Microsoft サポートをつかってWindows上のエントリを削除した。
その後でインストーラを動かすと、Eドライブがないよっていってインストールもできなくて詰んだ。
どうせレジストリエディタにどこにインストールしてあるよみたいな情報が残ってるんだろうなと思ってレジストリエディタ開いたら、案の定正しくなエントリが下記のパスにあった。
/HKEY_LOCAL_MACHINE/SOFTWARE/KONAMI/*
KONAMI以下のパスを削除したらインストーラが普通に動くようになったので、新Dドライブにインストールし直したら普通に動くようになった。
めでたしめでたし。
ワールズエンドクラブ【World’s End Club】をクリアしたので感想
点数としては60点。
ダンガンロンパの人が関わってるって聞いて、ストーリー面を期待して買ったけど、期待に応えるってほどではなかったかな。
クリア時間は8時間半くらいでした。
以下ネタバレ含みます。
まず、良かったところはキャラですね。
全員キャラが立ってたし、バニラちゃんとニョロは可愛いしアドだった。
声優も良かったので、バニラちゃんが喋るたびにアドを感じることができました。
逆に悪かったところはアクションパート。
なんか全体的にもっさり感がある。
スマブラで言えば横スマしか使えないみたいな感じ。
ジャンプとかダッシュの感じはカズヤが近いかな。
とにかくどのモーションも入力に対するレスポンスが遅い。
で、死ぬわけだけど、死んだ時の演出がトロい。
ライフ1しかないからそれなりに死ぬんだけど、その度にトロめの演出が入ってウザったい。
諸説ありそうなのは、全体的な難易度とストーリー。
敵の攻撃やら謎解きやらは正直そこまで難しくない。
難易度としては3Dマリオくらいかな。
なんで、対象年齢としては小学生くらいなんかなってなる。
大人としては物足りない感じ。
ストーリーは、途中までは割と良かった。
世界の謎とか主人公の正体とか、そこら辺の見せ方は結構良かったと思う。
ただ、最終的なオチの部分はありがちだなーって感じだった。
ブレイブリーデフォルトとか、moonとかそんな感じの、使い古されたメタい感じのオチ。
まあ逆に考えれば、小学生はそういうゲーム触れてる可能性低いだろうし、新鮮に感じられるのかもしれない。
こんなところかなー。
イラストとか演出とかBGMとかの記述のないところは普通で、あえて述べるほどのことはない。
とにかく総評としては60点っていう評価が妥当だと思う。
単位はあげるけど別に良いってほどでもない。
オススメってほどでもないんで、これよりいいゲームは山ほどあるので積極的にやるほどのもんじゃないですね。
著作権について
思考実験をします。
色の種類が有限で、画素数も有限であるので、十分大きなストレージを用意することで、フルHD程度の絵であれば全種類を網羅することができますね。
コードを書いてこれらを全種類作って、適当にブログかなんかに全ファイルを置いて公開しておきます。
Googleドライブとかに突っ込んでURLを公開するんでもいいです。
ところで、著作権というのは申請不要で、作成した時点で発生する権利だそうです。
よって、世の中に新たな作品が生み出された際に「私がブログで公開していたこの絵と似ている!著作権侵害だ!」という主張ができるわけです。
意味不明ですね。
ですが、おそらく実際は独創性がないだとか言われて棄却される気もします。
結果的に生まれたjgpなりPNGなりはバイナリ的に全く同じであってもです。
意味不明ですね。
人が生きる理由について
突然ですが、人が生きることに理由なんてないっていう話をします。
これと似たような話を聞いたことがないので、みなさんが内心で当たり前だと思っているのか、それとも思いついてないのかはわかりませんが、僕としては納得感があって面白い話だと思ってます。
もちろん、人の生きる理由なんて勝手に見つければいいと思うので、幸せになるために生きてるんだ!っていうのはそれはそれで良いと思います。
ただ僕はこんな話を思いついちゃったって感じです。
それでは本題。
かつて地球上に生き物はいなかったそうです。
そこに雷がいい感じに落ちていい感じにRNAができたそうです。
RNAは自己複製をする機能、というよりは性質を持っていて、どんどん自己複製をしたり進化したりするうちに今みたいな生き物ができていったらしいです。
ここで、自己複製をする機能を持っているものが、自己複製をする機能を持っていないものと比べて繁栄するのはとうぜんですよね。
そして、子孫の繁栄だの何だのって言うのは、自己複製という性質を持っているものがに結果的に起こるものです。
他の種族やら人種やらよりも優れている(っていう言い方も若干恣意的な感じがあって良くないかもしれません)ものが繁栄するというのも、結果的に起こることです。
生物自身に子孫の繁栄なんていう義務はなくて、自己複製という機能を持っているものが結果として繁栄するっていうだけです。
なので、LGBTだのなんだのの人に、生物としての本質からずれているっていうのは、ちょっとおかしいというか、押し付けなんじゃないのって言う感じがします。
その性質から生じるものを押し付けるのってなんか変な気がしませんかね。
あんまいい例えが思いつかないんですけど、女性に対して「女性とは胸が大きくなる性質を持っているのだから、全女性は巨乳にならなくてはならない」みたいな?
男性に対して「男性は筋肉質になるような性質を持っているのだから、全男性は筋肉もりもりのマッチョマンにならなければならない」みたいな?
そんなん人の勝手じゃんで終わり。
そーいうわけで、僕が言いたいのは、人が生きてることに、外の世界から意味は与えてくれないってことです。
RNAに生きる理由はないよね。
自分で勝手に「幸せになるために生きる!」っていうのは勝手ですけどね。
ちょっと話は変わるんだけど、人の意識なんてものは、機械と何ら変わらないんじゃないのっていうのも思ってます。
ここで言う機械っていうのは、パソコンみたいな複雑な電子機器ってイメージじゃなくて、もっと素朴な風車とか自転車とかとかそういうレベルのもののイメージです。
我々は、そういう機械を見た時、こういう仕組みに作ってるんだからこういう機能を持つのは当然だと思うわけです。
でも、その仕組みをしらない、あるいは理解できない人とか赤ちゃんからみると、とても複雑で理解の及ばない知性のようなものを感じるかもしれません。
風が吹いたときに回り、風が吹かないときには回らないというだけのものでさえも。
我々の意識というのもそういうものなんじゃないですかね。
他人を見たときに、複雑な思考やら意思決定やらをしているように見えても、本質は風車と同じ感じかもしれません。
「いや、私は今世界を認識していて、思考をしている!我考えるゆえに我あり!」っていう人もいるかも知れませんが、風車とか自転車もそう考えてるかもしれませんよね?
なんで人間やら猿やら犬やらには意識があって、風車や自転車には意識がないって言えるんですか?
風車や自転車は知性を感じられるような行動やらふるまいやらが見られないじゃないかっていうのは当然通りません。
それだったら脳死状態の人間はさっさとジャンクとして解体してパーツ取ったほうがいいです。
結局意識なんてそうだと思ってる・感じているっていうだけで、実在を実証できません。
なんか言いたいことからずれてる気もしますが、私は意識は、機構が理解できてないっていうだけの機械に過ぎないって考えてます。
なんかこういう哲学っぽいことを考えるの好きなんですよね。
僕はそういうの考えても、何にもメモらなくて忘れるのを無限に繰り返してます。
でもこういうのも、人類でちゃんと積み上げてったらもっと面白い考えにたどり着ける気がするんで、そのためにもたまには文字に起こそうかなと思います。
一応の補足ですが、別に生きる理由が外から与えられなくて、意識が機械と変わらんっていうのは、だから人間死んでもいいとはならないと思うんで、そこだけ補足しておきます。
物理的に意味がなくても、僕は死にたくないし、楽しく幸せに過ごしたいとは思っているので。
それでは。