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

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

【C#】(進捗 2019/09/23) PC画面の一部を切り出し、翻訳するWindowsアプリの開発

こんにちは。かくすけです。
PC画面の一部を切り出し、翻訳するWindowsアプリ、ちょっとずつ開発を進めています。
現時点での動作をGifにしました。

最低限使えるアプリになりました。

前回の記事以降に開発したのは以下の内容
・アプリ全体の大枠レイアウト
・画面からの文字列取得結果表示処理
・翻訳結果表示処理
・ショートカットキーでの翻訳処理呼び出し機能
・ショートカットキー変更機能
・処理非同期化

前回の記事はこちら
kakusuke98.hatenablog.com

細かい内容を全部まとめていては開発が全然進まないので
参考にさせていただいたページをまとめました。

参考

【画面からの文字列取得結果表示、翻訳結果表示】

文字取得、翻訳結果の表示には今回 Windows Form の dataGridView を使用しました。

dataGridViewへの行追加
www.sejuku.net

dataGridView表示範囲内での折り返し改行表示設定
dobon.net

【ショートカットキーでの翻訳処理呼び出し】

作成した Windows Form アプリがアクティブ状態の場合、ショートカットキー入力取得は比較的簡単です。
しかし、今回はゲームアプリがアクティブの状態でもショートカットキー入力を取得する必要があり、苦労しました。
その際に次のページを参考にさせていただきました。

フォーム外ショートカットキー取得
qiita.com

入力されたショートカットキーが対応するものかどうかの判定には次のページを参考にしました。

ショートカットキー判別
kitigai.hatenablog.com

【ショートカットキー変更機能実装】

設定されたショートカットキーの保持には連想配列(Dictionary)を使用しています。

連想配列使用(Dictionary)
www.sejuku.net

【非同期化】

非同期化には苦労しました。
しかし、ゲームプレイを邪魔せず使用してもらうためには必須の機能です。
(これをしないと翻訳するたびにゲームの操作が一時的にできなくなる)

非同期処理実行(async/await)
qiita.com

どこのページをみても"await Task.Delay(1000);"を使われており、実際に重い処理で動かしている例が少ないためピンときませんでした。

await Task.Run(() =>
{
    // 処理内容
 });

とすることで重い処理を非同期化できました。

今回のアプリでは
・画像取得処理
OCR API呼び出し処理
・翻訳API呼び出し処理

を非同期化することで連続して翻訳できるようにしました。

今後の課題

見ていただいてわかると思いますが、最低限動くものができただけで課題はまだまだあります。
今後はまず以下の対応を行う予定です。
・文字列取得と翻訳の精度をなんとか上げられないか頑張る
・フルスクリーンモードのゲームに対応していないため対応する