クリップボード共有アプリを作ったけど、実はあれ、当初考案したアプリを作れなかったので、無理くり作ったヤツだった。
当初は、リッチテキストに色々書いて、共有するのが目的だったんだけど、使用したwin32apiラッパーのクレートがリッチテキストの保存・読込みに対応してなかったので放棄した。
悩んだ末に、クリップボード共有アプリになったんだけど、やっぱり当初考えたアプリが気になるので、MS嫌いなのにwin32apiを調べ始める。
- win32api
昔のapiだから、全部関数。
しかも、引数更新系。
うわ~、古っ。
データは、構造体で、引数として渡す。
処理は、対象ウィンドウ(コントロール)にメッセージ飛ばして、処理してもらう。
引数は2個決まってて、あらゆる変数をその引数にキャストして渡してる。
しかも、int を用途毎に別名作ってるので、一目で何に使うのか分かりやすいんだろうけど、何するにもキャストキャストキャスト。
うーん、全く勉強する気にならん。
- クレート改造
とは言え、勉強しなきゃクレート改造も出来ないので、ちまちま勉強して、クレート改造に取り組む。
リッチテキスト自体は、導入されてて、機能は、書式設定のみ使える。
後は、保存と読み込みのメッセージを投げて、処理するようにすればよい。
メッセージ用の定数をヘッダファイル見つつ、追記。
保存・読込み用の構造体があるので、これもヘッダファイル見つつ、追記。
構造体のメンバにコールバック関数があるから、これも追記。
試しに動かしてみるが、当然動かないw
まぁ、そんな簡単に動くわけないよな。
win32apiのデータ型とRustのデータ型が違うので、コールバック関数に何設定すればいいのか、分からん。
更新引数はmut付ければいいのか?
Rustは生ポインタ使わないから、どう書けばいいのやら?(unsafe内なら使えるけど)
他のwin32apiのクレートを参照しつつ、書き換えていく。
データ型は、たぶんOKなんだが、ボタン押すとアプリが落ちる。
せめてコンソールにエラー出してくれぇぇぇ。
他のクレートを参照しまくって、見つけた!
同じような構造体定義にpackedを使ってた。
意味が分からんが、記載して、動かしたら、動いた!!
どうやら、メモリの空きを詰めるのがpackedらしい。
それだとC言語の想定しているメモリアドレスと違ってくるから、逆に落ちそうだけど、何故動くのか?
原因は分からんまま、動いたので、良しとする。
- データ共有アプリ作成
win32apiラップクレート改が出来たので、さっそく当初想定したアプリを作る。
クリップボード共有アプリのソースをコピペしつつ、画面デザインしつつ、完成。
今回は、「転送」ボタン押すとリッチテキストファイルに保存。
タイマーで1秒毎にリッチテキストファイルの更新を監視して、更新されてたら、自動読込み。
ボタン1個になったので、手間が減った。
しかも、クリップボード共有アプリでは、実現できなかった、書式付テキスト、表を転送出来るようになった。
これで思いついたアプリを作る事が出来て満足~。
- 画像の不具合
さっそく、別アプリ作ったよ~、と周知して、一人満足感に浸ってたら、画像が貼り付けできないと報告あり。
そういや転送される事しか確認してなかった。
転送後の画像をコピーして、Excelに張り付けたら、「Image」と文字列で張り付く。
うがぁぁぁぁ、そういやリッチテキストファイルって、全部文字列で保存していたな。
見た目画像なので、失念してた。
リッチテキストに対応している、ワードパッドとWordは、画像として貼り付けできるが、ExcelとTeamsにはImageと文字列で張り付く。
どうにもならんので、Excelには、形式指定貼り付けして。TeamsはExcelに張り付けた画像をコピペして、と対策案を提示。
コピーした文字列を画像に変換出来ればいいんだけど、どうやればいいのか、さっぱり分からん。
分かる方、教えて~。