高 DPI スケーリング上での GetWinTx

2015 06/28
[ 2012 / 06 / 28 ]
DPI の仮想化 スケーリング を OS にしてもらうかどうかで 此処 ソフトの小物たちのプログラムは フォームのサイズとコントロールの配置 にも書いた様に OS の 標準のフォントの サイズの何倍かで フォームの大きさを決めているので 最初から System DPI Aware になっています。
そのため スケーリングの影響で文字が滲んでしまったりフォームが 大きく表示されてしまう事を避ける為 内部的には スケーリングに対応している事を 宣言するコードを入れてきて個々のプログラムについては OS のスケーリングの影響を受けない様に改善中で 此は結構うまく働いて来ています。
個々のプログラムで寸法を採ったり他のプログラムのサイズを計ったり調整したりと言う事は スケーリングが どちらかに統一されていれば特に矛盾は生じないのですが 此処に来てどうしても避けられない事が起きて来ました。
他のプログラムの持っているテキストを取得する GetWinTx の有る動作が引っかかりました。GetWinTx も普通に テキストが取得出来る時は問題はないのですが それとは離れた 何らかの コントロール の持つテキストを取得する時には ( 例えは TreeView や ListView ListBox ComboBox 等 ) マウスカーソルの位置のテキストならマウスカーソルの 位置を指定して その場所でのコントロール の持つテキストを入れてもらうと言う動作になります。 マウスカーソルの位置指定は コントロールに対してですから 通常 クライアント座標指定と言う事になります。
クライアント座標ですから 左から XX ピクセル 上から YY ピクセルの所にあるテキストをお願いします。 と言う様なリクエスト型式になりますが 此の クライアント座標 が DPI スケーリング を OS にしてもらっている物と してもらっていない物とで違ってきてしまいます。GetWinTx が してもらっていない→相手も してもらっていない GetWinTx が してもらっている→相手も してもらっている 様に同じ状態の時なら特に問題は有りません。 ただ 相手が スケーリングされているのかいないのかは こちらからは ( GetWinTx 側 ) 解りません。
一番端的な例は デバイス マネージャ のウィンドウです。Windows 8.1 / 10 共に高 DPI 環境では文字が滲んでしまいます。 此は System DPI Aware にもなっていないのでで拡大されて表示されていると言う事です。此のウィンドウの表示部は SysTreeView ですから GetWinTx で各項目のテキストは取得可能です。GetWinTx もスケーリングされた状態の立ちあげでは 項目のずれもなく問題は無いのですが 互換性から 高 DPI ではスケーリングしないにすると 項目が何行かずれて取得されて しまいます。前述した様に クライアント座標が スケーリングの違いでずれて来ているようです。
此の現象は以前に修正した MousePos の拡大窓がカーソル位置とずれるのと同じ事です。拡大窓 はデスクトップウィンドウの クライアント領域 ( 当然 DPI スケーリングはされていない ) その物を大きくコピーする訳ですから指定する位置 ( クライアント 座標の位置 ) もスケーリングされていない素の位置を指定しなければならないので MousePos もスケーリングされては ならないのと同じ事です。
GetWinTx は 単発のプログラムですから スケーリングする しないを切り替えて対処も出来ますが ( あまりスマートで 無い事は確かです。) 同じ様な機能を持つ ClipSaver.dll は ClipSaver.exe と一連託生で切り替える事は出来ません。
どうするかは考慮中ですが こちら側から相手がスケーリングされているかどうかが解らないい以上 今の所 自動で行う此と言った いいアイデアも浮かびません。大体 システムツールの デバイス マネージャ や イベント ビューア等が DPI スケーリング されている ( 滲んで表示される ) のが最初からおかしいのではないかと思ったりしていますが いずれにしても システムの DPI を 96dpi から動かさない環境には関係の無い話です。

-チップスに戻る- -トップページに戻る-