2019の14日目の記事です。速攻作れるだろ~と思っていたら、意外とめんどくさかった。なにより日本語の標準モジュールだけで実現する解説記事が多分ない。作り方なんていいんだよ!ソースくれって人は下記のソースをぶっこんで使ってどうぞ。・GitHub-easyToastちなみにLicenceはMITLicenceです。今回勉強しつつ調べてまとめているので、もし間違っているところがあればツイッターなどで教えて下さい今回は利用する標準モジュールのみで実装を行う。■トーストとは?古すぎないWindowsでなにかApplicationからのお知らせがあるときに画面右下に出てくる通知のようなもの。バルーンと呼ばれることもあるが、厳密にはこれはトーストである。Shell_NotifyIconWで通知申請を行うなにがなんのことかわからないと思うので、順番に説明する。サンプルコードが何度か登場するが、基本的には以下のimportを行っている前提で話をすすめる。)■Pythonでctypeを利用するWindowsでトーストを出すにはWindowsAPIからバルーンを出すリクエストを出す必要がある。WindowsAPIを叩く際にbathなどを経由してもいいが、PythonからWindowsAPIを叩く良いやり方はctypeを使うctypeとはPythonでCの関数ライブラリを使うことが出来るものだ。簡単なコードでとりあえずctypeを試したいのであれば、以下の記事がとても参考になった。例ctypeの詳細を知りたい方は以下をどうぞ。Pythonのための外部関数ライブラリ■APIにあった構造体を用意するctypeを使って、まずはAPIを叩くための構造体を準備する。ctypesのStructureを継承したクラスで構造体を定義します。後述するWindowsAPIの仕様書(英語)を片手に準備する必要があります。]具体的なやり方などは下記が参考になった。使うんだなーくらいで今は大丈夫。■WindowsAPIを利用できるように読み込むWindowsAPIを読み込んで、引数の定義と戻り値の定義を行う今回利用するAPIはLoadImageとNotifyIconだ。利用している文字コードなどの違いがある。今回はWを利用している。必要な引数等はMicrosoftのドキュメントが参考になった。structureひとまず、これでWindowsAPIが利用可能になった。■LoadImageWで画像アイコンを利用できるようにするバルーンで利用しているアイコンは.icoといった拡張子の画像ファイルだ。変換サービスやフリー素材などがあるので、適当な画像を用意しよう。アイコンなしでトーストを出す方法も記載するため、この項目は飛ばしても構わない。0x00000050)これはLoadImageWを呼び出すコード。今回は画像のファイルパスを指定する。読み込む画像の形式を指定する。試していないけど0だとビットマップが読み込める?・第四引数アイコンの幅を指定する。・第五引数アイコンの高さを指定する。・第六引数オプションフラグを設定する。16進数で記載されていて最初はよくわからないかもしれないが、WindowsAPIでは有効にする設定の数値を合計したものを指定する。0x00000001の設定と0x00000002の設定を有効にするのなら、0x00000003を指定する。(16進数なので繰り上がりに注意)足し算でなく、ビット演算で合算してもよい。0x00000002どのような設定値があるかは上記マニュアルを確認する。今回はLR_DEFAULTSIZE(0x00000040)とLR_LOADFROMFILE(0x00000010)を指定している。成功すればイメージのハンドルが返却される。Shell_NotifyIconWで通知申請を行うまずはWindowsAPIに渡すデータを作成する。hicon)さて、とうとう通知を出す。それぞれ何をしているかざっくり解説する。作成した構造体のメモリサイズを指定する。実行しているPIDを取得する。上記サンプルでは自身のPIDを取得している第四引数どんな情報があるかやどんな表示をするかなどを指定する。NIF_ICON,NIF_TIP,NIF_INFOを有効にした。画像を利用しない場合はNIF_TIP,NIF_INFOを有効にする。第六引数アプリ名や詳細の記載を行う。トーストのアプリ名が以前はここの指定内容になっているような記載をみたが、特に反映されなかった。するアイコンの設定を行う。今回はNIIF_USER,NIIF_NOSOUND,NIIF_LARGE_ICONが有効になっている。通知時に音を出したいなら0x00000010を引く。第十三引数GUIDを与える。設定するかはドキュメント読むだけだとわからなかった。第五との違いはタスクバーのアイコンか、トーストのアイコンかの違い。今回はどちらも同じものを設定する。notify_data)第一引数の0は表示、2は通知を汚さないように削除している。以上でトーストをPythonから利用できる。他のWindowsAPIにも応用できるはずだ。最後にトーストを出す便利ソースを紹介する。コメントをキャンセルメールアドレスが公開されることはありません。