Grabacr07/KanColleViewer

canvas回りのいろいろ

kancolleojisan opened this issue · 3 comments

はじめまして。2~3個ほど謎な動作を見つけたので報告させて頂きます。

1.ゲーム画面でTabキーを押すとcanvasからフォーカスが外れて2度と戻らない
CSSをいじるとページ内のリンクを渡り歩けている所は確認出来ますが、
Shift+TabでもTabを押し続けてもcanvasに戻ってくることは出来ないみたいです。
Alt+TabやCtrl+Tab、Win+Tab等で切り替えをする際にうっかりTabキーを先に押してしまうと
その瞬間に戻れなくなります。人によってはフリーズと表現されているのではと思います。

2.Tabキーを押さなくてもフォーカスが外れてしまうことがある
左クリックで普通にプレイしているだけでも唐突にフォーカスが外れて(カーソルがHandになるべき所でもArrowになっちゃう)戻ってこなくなることがあります。
この時は最小化(アイコン化)して元に戻すとフォーカスが戻るのでそれほどプレイングに支障はないのですが、少しだけ気になります。
先行入力気味でクリックしていると、なりやすいような気がしています。

3.スクリーンショットの保存に失敗する
起動してプレイと放置を繰り返して長時間経つと、唐突にエラーが出るようになります。
一度このエラーが出ると、それ以降は何度カメラボタンを押しても同じエラーが出ます。
ステータスバーには
The underlying frame is no longer valid - please check the IsValid property before calling!
と表示されています。

・対応策
見よう見まねで書いてみました。努力の痕跡として見て頂けると嬉しいです。

1.ゲーム画面ではCefSharp.Wpfコントロール内のTabキーを封印する
xaml(CommonやKanColleHost等)の記述でKeyboardNavigation.TabNavigationをいじる方向で最初はやってみたんですけど、どこに書いても効いてる感じがなかったので、ここで肚をくくってCefSharpのソースをぐるぐる巡ってみました。
この辺かなと思ってWpfKeyboardHandlerを継承してみました。
KanColleHost.cs

	public class HandleTabPress : WpfKeyboardHandler
	{
		private readonly ChromiumWebBrowser owner;
		public HandleTabPress(ChromiumWebBrowser owner) : base(owner)
		{
			this.owner = owner;
		}
		public override void HandleKeyPress(KeyEventArgs e)
		{
			if (e.Key != Key.Tab || owner.GetMainFrame().Url != Properties.Settings.Default.KanColleUrl.ToString())
			{
				base.HandleKeyPress(e);
			}
		}
	}

これを if (newBrowser != null) のスコープ内で

			newBrowser.WpfKeyboardHandler = new HandleTabPress(newBrowser);

しました。
これでKanColleViewerのUI上でだけTab移動出来て、ブラウザ上では出来ないようになりました。
newってこういう使い方で良いのでしょうか。良いのかな、本当に大丈夫かと迷いつつ書きました。

2.放置
timeoutで強引にfocusさせまくるくらいの事しか思い付かず、それで良いかという判断も出来なかったので、ここはそのままにしました。

3.なんとなくエラーメッセージに従ってみる
多分コレかなーって、様子見中です。
CefBridge.cs

			.FirstOrDefault(x => gameFrame.IsValid ? x.Url.Contains("/kcs2/index.php") : false);

少しでもフィードバックとしてお役に立てたら嬉しいです。
それでは失礼いたします。

はじめまして。kancolleojisan様の指摘で今起きている現象が把握できました。
ひたすらGPU周りの環境を見直したりしていて、私の環境だけなのかと混迷していたので助かりました。ありがとうございました。

あと追加で気付いた事なんですが、windowsのタスクバーのアイコンが明滅する(アイコンキャッシュの再構築?)のタイミングでも外れる事があります。
簡単なプログラミングしか出来ないので申し訳程度ですが報告させていただきました。

uribatake様はじめまして。いえいえ、お役に立てて嬉しいです。
Tabキーの方で気付いたのでフォーカスに目を向けることになったものの、もしタスクバーの方で気付いてたら私もGPUかな?となっていたかと。

Ctrl+Shift+ESCからexplorer.exeを強制終了させて、再度ファイル>タスクの実行からexplorerを起動させた時みたいなのですね。なんか色んなメッセージ飛んできてそう…

その後の報告です。
一旦は状況は落ち着いていたように見えていたのですが、「ページを更新する」ボタンを押下後に「3.スクリーンショットの保存に失敗する」が確定で発生するようになってしまいました。
以前はページを更新してもしなくても発生していた(のを確認してからissueを投稿していました)のですけれど今回は確定なので、ページを更新した後に毎回初期化ないしは取得しないといけない何かがあると、その方向で考えました結果

ScreenshotAction.cs

 if (!this.AssociatedObject.TryGetKanColleCanvas(out this.targetCanvas))

として、毎回Canvasを取得する形にすると解決できました。
恐らくページ更新のタイミングでCanvasを作り直すようにしたのかなーと思ってます。
ご参考になれましたら幸いです。