かくすけのいろいろ作るブログ

かくすけの開発者ブログです。開発の他いろいろなモノづくりについて書きます。

WindowsFormアプリをUWPに移行しようとして諦めた話

こんにちは。かくすけです。
今回は残念ながらWindowsFormアプリをUWPに移行しようとして諦めたことの報告になります…

UWPに移行をしようと思った経緯

私は次のようなWindows Formアプリを開発中です。
kakusuke98.hatenablog.com

WindowsFormでの開発は順調に進んでおり、基本的な翻訳動作はちゃんとするようになりました!
ゲームによっては正しく動作しなかったり、Google翻訳自体の誤翻訳があったりはしますが、自分や仲の良い人の間ではテストで使ってもらえるレベルにはなったと思います。

しかし公開するとなるとまた別。
翻訳処理を動かすたびに私のお財布からお金が飛んでいく仕様なので、そこを補う戦略が必要になります。
使ってもらいながら収入を得るためには、広告収入が良いと考えていたのですが、WindowsFormに広告を載せることはできず、最新のUWPを使用する必要がありました。

そこで、今までWindowsFormアプリとして開発していたものをUWPに移行しようとしたのですが…諦めたというのが今回の記事の内容になります。
とはいっても、絶対に無理!ってわけではありません。ただ、人に使ってもらう上での難易度的に現実的ではないなと… WindowsFormに広告載せられないの先に調べておけって話ですね!
使い慣れてるものを使って楽しようとした罰が下りました。

具体的にどの処理が移行できなかったのか?

UWPへの移行を諦めたといっても、もちろんすべての機能が移行できないわけではありません。
移行できなかったのは"画面の一部をキャプチャする機能"の部分です。

ここで、画面の"一部"というのがポイントです。
私の開発しているアプリではゲーム画面の一部を画像として切り出し、翻訳します。
しかし、UWPはWindowsFormにくらべてセキュリティががちがちになってしまったため、他のアプリや画面全体に影響のある処理は普通にはできなくなっています。

ですが、画面のキャプチャをとる方法は準備されてはいますし、実際に自分でコードを組んでみました。
UWPで画面のキャプチャを取得するには「Windows.Graphics.Capture」というものを使います。

参考
www.kinakomotitti.net

docs.microsoft.com

動作としてはキャプチャさせるウィンドウまたは画面をユーザーが選択することで、画面のキャプチャを許可できるというもの。
f:id:kakusuke98:20191104174416p:plain

これで許可して、画面のキャプチャをできるようにするところまではできました。
内容は参考にさせていただいたページほぼそのままなので割愛。

しかし問題はここから。そのウィンドウや画面から一部を切り出すという部分。

問題1. ユーザーがウィンドウを選択した場合

ここでユーザーがウィンドウを選択した場合はどうしようもありません。
できそうでできないんですよ。おしいんです。次の画像みたいな感じ。
f:id:kakusuke98:20191104175856p:plain

開発中のアプリでは、画面内のキャプチャしたい箇所をドラッグアンドドロップで指定します。
ここで、ユーザーが選択してキャプチャを許可したウィンドウの左端の座標さえわかれば、キャプチャしたい箇所の座標といい感じに演算して、キャプチャしたい箇所の画像を取得することができます。

  1. ユーザーがキャプチャするウィンドウを選択
  2. ユーザーがキャプチャする箇所を設定
  3. システムがウィンドウ全体画像を取得
  4. ウィンドウ左端の座標とユーザーが設定した箇所の座標をつかって、3で取得した画像の一部をトリミング

という手順でなんとかできるのです。できるのですが、左上の座標そのものを取得できないという仕様なのでどうしようもありませんでした。

問題2. ユーザーが画面を選択した場合

では、ユーザーが画面を選択した場合はどうでしょう?
たぶん大丈夫です。特に"すべてのディスプレイ"を選択してもらえたら安心です。
しかしなぜ諦めたのか?というと、ユーザーに対して「すべてのディスプレイを選択してね!」といちいち言うのはあまりよろしくないと思うからです。
世の中ちゃんと説明を読む人ばかりじゃありませんからね。
できる限りユーザーが何も考えずにやっても何とかなる仕様にしたいのでそれはボツにしました。

ここで、ユーザーが画面を選択するときの表示を"すべてのディスプレイ"だけにできるのであればよかったのですが、資料を読んだ感じだと無理そうでした。

UWPへの移行を諦めて今後どうするか?

上に書いたように、惜しいところまで行ったけど無理だった。という状況です。
では今後どうするかというと、ひとまずはこのままWindowsFormアプリとして開発を進めます。
で、お金の部分は寄付をいただくのと、拡張機能使用のための課金を準備することで賄いたいと考えています。
どうか、アプリを公開した際には"がんばって!"の寄付をいただけますと幸いです。
どうしてもマイナスが大きくなってしまった場合にはシステム停止ですね…

しかし、UWPへの移行を完全に諦めたわけではありません。
Microsoftさんは結構開発者の意見を取り入れていただけるので(多分このキャプチャ機能自体がそうやって追加された機能)

  • ウィンドウの一部をキャプチャできる機能の追加
  • 選択されたウィンドウの左上の座標を取得する機能の追加
  • ウィンドウと画面の選択肢を絞り込めるオプションの追加

を要望として出すことにします。
もし、この希望を聞いていただけたときには、今度こそUWPに移行したいですね!!
あ、私が気づいてないだけですでにこれらの機能が準備されていたら、コメントで教えていただけるとありがたいです!!

さて、今回はあきらめるという結果に至ったわけですが、UWP開発に挑戦する良い機会になりました。
クセはありそうですが、そこまでWindowsFormとの差は大きくないので、次にもうちょっと単純なWindowsアプリを開発する場合はUWPを使ってみようかな。

自分用に作りたいYoutubeの管理アプリとか Oculus Rift の一時的なデバイス無効化アプリとか、各種SNSの管理アプリとか作ってみたいんですよね。
夢がひろがるぞ~