スポンサーリンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 昇格させる事にした | トップページ | Windows10でも出来たので »

Windows10は特別扱い?

今は、Mirror-DTCの次バージョン用に、Mirror-DTC Transporterを開発しているのだが、大体は動作する様になったので、開発環境である所のWindows8.1とは異なるWindows7/Windows10環境でも動作確認してみた。そのままでは、双方で動作しなかったのだが。

このブログをずっと見てきている人なら判る筈なのだが、今現在、Mirror-DTC TransporterはExeファイル以外に、Dllファイルもないと動作しない。

このDllというのは、元々は、普通に、「標準Windowsライブラリを使用する」という設定にして開発していたのだが、このDLLは、開発環境である所のVisual Studio 2017をインストールしているWindows8.1環境では、普通に使えたものの、Windows7で利用しようとすると、「コンピュータにVCRUNTIME140.dllがないためプログラムを開始できません・・・」、というダイアログが表示されてしまった訳だ。

なので、プロジェクトの設定を「標準Windowsライブラリを使用する」から「スタティックライブラリでMFCを使用する」に変更してビルドする様にしたのだが、その結果としては、Windows7上でも問題なく起動はする様になった。

もっとも、Windows7では、ウインドウ映像のキャプチャーに制限があり、例えば、Direct2D描画しているAGMPlayerの表示画面なんかは取得できないし、半透明のタイトルバーなんかについても、GPU描画なので、マトモにキャプチャーできないので、そういった映像がMirror-DTCクライアントにもマトモに表示されない、というのは、Windows7でAG-デスクトップレコーダーのウインドウ録画を利用しようとする場合と同様だ。

しかしまあ、メモ帳やWebブラウザのクライアント領域なんかは、普通にキャプチャーできるので、とりあえず、Windows7でも、動作する様にはしたのだが、意外と言うかなんというか、Windows10では、もっと不可思議な現象が色々と出てきた訳だ。

まず、Windows10の場合、キャプチャーしたウインドウの映像をMirror-DTCクライアントに表示すると、その周辺に数ピクセルの黒い領域が存在していた訳だ。

で、調べてみると、上記は、DWMが動作している環境では、由緒正しいWin32APIである所の::GetWindowRect関数が正しい値を返さない、という事が原因の様で、この問題を解決する為には、DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, rect, sizeof(RECT))、みたいな感じで、領域を取得する必要がある事が判った。

まあ、DWMは、Windows7/8.1でも動作している筈で、これらでは問題が出なかったにも関わらず、Windows10では問題が出る、という点に関しては釈然とはしなかったのだが、とりあえず、上記の問題については、上記+αの対策で解決できた。

で、次に、Transporterでは、Mirror-DTCクライアントに表示させる事にしたウインドウがデスクトップ上でアクティブ化されると、可笑しな現象が発生する場合があるので、アクティブ化されたら、デスクトップに表示する処理を追加してある訳だ。

しかし、こういう仕様にしておくと、そのウインドウを操作したい場合には、タスクバーなんかで選択する事で、簡単にデスクトップ上に表示して操作可能で、操作が終わったら、非アクティブ化するだけで、また、Mirror-DTCクライアント側に表示させる事が可能になるので、操作性上も望ましい感じだったのだが、Windowsの場合、通常は、アクティブウインドウが閉じられると、その他のウインドウが自動的にアクティブ化されてしまったりする訳だ。

なので、Mirror-DTCクライアントに表示させるウインドウというのは、普通は、自動的にアクティブ化してもらいたくはないのが普通の筈なので、Mirror-DTCクライアントに表示させる設定をしたウインドウには、::SetWindowLongPtr関数を使って、WS_EX_NOACTIVATE属性を追加してあった訳だ。

上記の様にしておくと、Windows8.1/7では、タスクバーのアイコンをクリックした様な場合には、普通にウインドウはアクティブ化されるのだが、他ウインドウが非アクティブになったからといって、Mirror-DTCクライアントに表示させる設定を行っているウインドウについては、自動的にアクティブ化される事が無くなった。

なので、良い感じだったのだが、Windows10の場合、上記の属性を指定すると、タスクバーのアイコン表示が無くなるソフトもあった訳だ。

も、あった、と、書いているのは、無くならないモノもあった、という事で、必ずなくなるなら、まだ対処のしようもあったのだが、ソフト毎に挙動が違うとなると、上記の手法は、使う訳にもいかなくなった訳だ。

と、いう事で、今の所、Windows10対応のために、上記のWS_EX_NOACTIVATE属性の指定はやめてしまっているのだが、そうすると、注意していないと、Mirror-DTCクライアントに表示させ続けたいウインドウがいきなりデスクトップに表示されたりしてしまう事も多々ある。

なので、もう、アクティブになったからといって、デスクトップに表示させるのはやめようか、と、思ったりもしているのだが、Windows10さえ、Windows8.1と同様な挙動を示してくれれば、苦労は無かったのに、と、思ったりしている今日この頃だ。

« 昇格させる事にした | トップページ | Windows10でも出来たので »

2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google