waiei -blog-

その日の出来事を簡単に紹介する日記

蜃気楼の画質向上

2017-05-07-Sun-01:00
※5/7 AM9:00追記あり

こんにちは、A.Cです。
昨日も記事を更新したばかりですが、蜃気楼の拡大時画質向上に成功したので緊急でバージョンアップしました。

蜃気楼1.25

旧バージョン
1.24
※クリックして拡大

新バージョン
1.25
※クリックして拡大

Windows7の時は新バージョンと同様の画質で拡大していたのですが、
Windows8以降かなり画質が落ちていました。

で、Windows10のCreatorsUpdateから画質が復活したという情報を以前から耳にしていたのですが相変わらず蜃気楼の画質が低かったのでそんなことはないのではと思っていました。
ところが、DWMAPIのサムネイル機能のサンプルプログラムをいじっていたら特定条件下に限り画質が向上することがわかりました。

条件とは、 DwmUpdateThumbnailProperties 関数でDWM_THUMBNAIL_PROPERTIESのfSourceClientAreaOnlyをtrueにすることでした。

つまりどういうことなのという話ですが、このフラグを有効にすることで対象のウィンドウのクライアント領域(ウィンドウフレームやタイトルバーを除いた部分)のみを拡大対象にすることができます。
今までの蜃気楼は、ここのフラグをfalseに設定してウィンドウ全体を取得、タイトルバー等を表示しないように位置をずらして表示させていたために今回の画質向上の恩恵を受けられなかったみたいです。(何故ウインドウ全体なら低画質のままなのかは謎ですが)

何故そんな面倒なことをしていたのかというと、ここのフラグを有効にしてもウィンドウ全体が取得されていたためです。
まあ、実際は設定しているのに反映されないわけがないのですが、これはHSPで開発しているのが原因の一つでもあります。

通常であれば、DWM_THUMBNAIL_PROPERTIESのページに書かれている通り、fSourceClientAreaOnlyをtrueにするだけでいいのですが、HSPでは「fSourceClientAreaOnly」が定義されているわけがなく、自分で設定する必要があります。
DWM_THUMBNAIL_PROPERTIESの定義部分のソースは以下のようになっています。
#define DWM_TNP_RECTDESTINATION 0x00000001  
#define DWM_TNP_RECTSOURCE 0x00000002
#define DWM_TNP_OPACITY 0x00000004
#define DWM_TNP_VISIBLE 0x00000008
#define DWM_TNP_SOURCECLIENTAREAONLY 0x00000010
    dwFlags=DWM_TNP_RECTDESTINATION | DWM_TNP_RECTSOURCE | DWM_TNP_OPACITY | DWM_TNP_VISIBLE | DWM_TNP_SOURCECLIENTAREAONLY
    dim tnProperties,11
    lpoke tnProperties,  0, dwFlags
    lpoke tnProperties,  4, 0
    lpoke tnProperties,  8, 0
    lpoke tnProperties, 12, drawx
    lpoke tnProperties, 16, drawy
    lpoke tnProperties, 20, 0
    lpoke tnProperties, 24, 0
    lpoke tnProperties, 28, crect(2)
    lpoke tnProperties, 32, crect(3)
    poke  tnProperties, 36, 255
    poke  tnProperties, 37, 1       ;0なら不可視
    poke  tnProperties, 41, 1       ;1ならクライアント領域のみ

要するに構造体は連続したメモリにデータを入れたものになるのですが、最後の行に書かれている41バイト目のここが1の時にfSourceClientAreaOnlyがtrueとなります。さて、じゃあこの41バイト目というのはどこから出てくるのかという話ですが、DWM_THUMBNAIL_PROPERTIESのページに書かれている順に定義するので、それぞれの値サイズずつずらして代入していきます。




DWORD dwFlags;0バイト目から4バイト分
RECT rcDestination;4バイト目から4バイト分×4
RECT rcSource;20バイト目から4バイト分×4
BYTE opacity;36バイト目から1バイト分
BOOL fVisible;37バイト目から4バイト分
BOOL fSourceClientAreaOnly;41バイト目

はい、上の赤字部分、BOOL(trueかfalseか)なのに4バイトあります。今までここは1バイトだと思い込んでいたので38バイト目から1バイトを書き換えていたのですが反映されていなかったわけです。わかるかー

とにかくまあ、いろいろいじっていたら上記原因が解明できたので1.25に反映しました。

ちなみにですが、クライアント領域を取得した場合、Aeroの合成部分は黒色になります。
例えばエクスプローラーを拡大対象にした時がわかりやすいと思います。
1.25Aero

タイトルバーが黒くなっています。これはDWMによってウインドウを合成する前の状態を取得しているためなので、対応できません。仕様です。

1.24では合成後のウインドウを取得しているためしっかりと色が付きます。
1.24Aero

大した問題はないと思いますし、画質を落としてまで1.24表示にする必要はないと思いますが、settings.iniを編集することで1.24モードの表示に戻すことができます。詳しくはreadmeを参照してください。

追記:ちょっといじったら黒色問題は対応できたので1.251として更新しました。5/7の9:00以前にDLされた方はお手数ですが再DLをよろしくお願いします。

まあクライアント領域のみ取得とか言ってたのに実際は余計な部分まで取ってたりしたんでそのあたりどうやって消すかいろいろ試行錯誤しましたががが

蜃気楼・WSCの更新しかしてない

2017-05-06-Sat-19:00
拍手レス
拡大した後の非アクティブ時に、上のアクティブウィンドウまで拡大されてしまいます。また、画面左外に出るようにウィンドウを置くと左端が白くなる等表示がおかしくなります。前バージョンでの症状は私はGDIモードを使わなくてもなっていた為、環境のせいかもしれませんが、ちなみにwin7 64bitです。疑似カーソル素晴らしいですね、もう諦めてたゲームもこれで出来そうで凄く感謝しています(rizunさん)
遅くなってしまいすみません、情報ありがとうございます。
いただいたスクリーンショットを見た感じではやはりGDIモードになっているのが原因かなと思います。

<再現>
GDIモードで上に重ねたとき

これは、Aeroが有効な時と無効な時のウィンドウの管理の仕方が異なるのが原因で、Aeroが有効な時はウィンドウがそれぞれの情報を持っているため、ほかのウィンドウに重なった時でも全く影響が出ません。

Aeroが有効

ところが、Aeroが無効な状態(Win7以前のベーシックテーマやクラシックテーマ使用時)は全体でウィンドウの画面情報を共有しているため、上にほかのウィンドウが重なっているとその部分がそのまま取得されてしまいます。

Aeroが無効

一応、Aero使用時と同様に重なったウィンドウの影響を受けないようにすることも可能ですが、対象ウインドウに手を加える動作となるため、安定性が下がり、重くなります。

詳細はMSDNへ:デスクトップ ウィンドウ マネージャー

とまあ、そういうわけでGDIモードで使っている以上どうしようもない問題になりますので現状直すのは厳しいと思います。
また、GDIモードは定期的に対象ウィンドウの画面をキャプチャしているため非常に処理が重く、蜃気楼が期待している動作とならないため使用を推奨しません。申し訳ありません。

もう一つ、画面からはみ出してしまっている部分の描画がされない問題ですが、これは蜃気楼が縮小をサポートしていないのと理由が同じで、GDIモードではディスプレイからはみ出た部分が更新されません。また、DWMモードでもアプリによっては更新されないことがあります。DirectDrawを使用しているゲームを移動させたときなどにこう言った現象が発生します。

DDゲームを移動

この辺りもWindowsの仕様の話になってしまうのでこちらでの対応はかなり難しいと思います。
何かいい案が思いついたら対応しますが基本的にはこのままだと思います。ご了承ください。




こんにちは、A.Cです。
Webサイトを久しぶりにリニューアルしました!
ある程度横幅が大きいときは全体的に拡大して見やすくなるようにしたつもりです。
この辺りが使いづらいなーと思ったことがあれば言ってもらえれば対応できるかと思います。
ちなみに前回のリニューアルが2013年6月だったので3年半ぶりなんですねー。

さて、今回も相変わらず蜃気楼の話。

DPIスケーリングに対応しました!
DPIスケーリング
※クリックで拡大表示

左から
・DPIスケーリング対応(公開しているものと同等)
・Windows10 CreatorsUpdateから追加されたDPI非対応アプリの新しい描画方法
・従来のDPI非対応アプリ
です。全体的にきれいに描画されているのがわかるでしょうか。
せっかくの拡大表示ソフトなのに、肝心なソフトそのものが小さくて使いづらいといった現象から解放されます!

ちなみにWindows8.1以降は、ディスプレイごとにDPIの設定を変えることができるのですが、それにも対応しています。


モニタ別DPI
左が96dpi、右が120dpiです。

実はこれ、地味な更新だけど結構内部的に書き換えています。
そんなわけで使いやすさ重視にしていきたいと思いますので、
これからも蜃気楼をよろしくお願いします。

ちなみにWSC3もDPI対応など、蜃気楼と同様の修正をしています。
こちらはソースファイル込みなので気になる方はぜひいじってみてください。

それぞれのDLはこちらから。
蜃気楼 / WinSizeChanger3

ではでは、今回はこの辺りで。


東方新作の自機チルノじゃないですかやったー!

サイトの更新はまだ完了しないけど

2017-02-21-Tue-23:30
拍手レス
>RPGをプレイするのに蜃気楼を使わせて貰いました。大きな画面でプレイできるのはやっぱり良いですね。ありがとうございます。 (ライさん)
こちらこそありがとうございます!
最近は何とかマウス入力向けの対応しようと奮闘していますがそもそもの用途はキーボードのみで遊べるゲーム向けなのでRPGは特に相性がいいと思います。
今後も蜃気楼をよろしくお願いします。

>音楽関係がイイネ!
ありがとうございます!

>調べて頂けるというので嬉しくて再び蜃気楼 1.11b試してみました。タイム表示があると確認しやすいかと思い、使用したのはMPC-BEという動画再生ソフトとAudioEditorというmp3編集ソフト。どちらも非アクティブ時はやはり画面が止まったままで音声だけ流れてます。以前試したのはタイトルは忘れましたがいくつかのPCゲームとpcsx2でした。ちなみにESETは蜃気楼、WinSizeChanger3両方とも誤検出しません (rizunさん)
情報ありがとうございます!
早速AudioEditorをDLして確認してみましたが、とくに画面更新が止まることがなかったためいろいろ設定をいじってみたところ、GDIモードの時の非アクティブ時に画面更新が止まることを確認しました。
PCへの負荷が大きいためGDIモードは基本的に推奨しませんが、非アクティブ時にも動作するように修正して1.21として公開しています。こちらでの確認をよろしくお願いします。

>蜃気楼ツールありがとうございます
蜃気楼縮小機能お願いいたします最新のツールの場合には100%が最低ですね
(卍さん)
申し訳ないです、蜃気楼はオリジナルのソフトの上に画面を重ねるという性質上オリジナルより小さくすることができません。
正確には、できることにはできるのですが後ろに100%のサイズでオリジナルウインドウが表示されてしまうため意味がありません。
また、オリジナルウインドウが画面端をはみ出してしまった場合、蜃気楼のコピーウインドウでもその部分の更新が止まってしまうので全く使えない状態となってしまいます。
そのため、100%より縮小して表示する機能は実装できません。ご了承ください。




こんにちは、A.Cです。
蜃気楼ですが、rizunさんからの拍手コメントにより特定の条件下で画面更新が止まることを確認しましたので修正バージョンを公開しました。
トップページまたは下記リンクからDLができます。

蜃気楼1.21

このURLはサイトリニューアル完了後には使えませんので、リンクが切れている場合は一度サイトトップページで確認してみてください。

ブログでは触れていなかったの1.2以降の新機能紹介です。
・疑似マウスカーソル機能実装
疑似マウスカーソル
マウスカーソルがある位置に疑似カーソルが表示されます。
これでマウスが必要なゲームやツールも安心!?
※オリジナルのカーソルも表示されるので混乱しないように注意してください
※フルスクリーン時は使用できません

・疑似カーソルは好きな画像に変更可能!
好きな画像
動画キャプチャする時に好きな画像をカーソルとして撮影できます!

・非アクティブ時に処理を停止しないモード追加
非アクティブ
アクセサリなど、常時アクティブではないものに使用できます。

・設定保存機能追加
蜃気楼終了時に現在の設定を保存し、次回起動時はその状態で起動します。
ただし、どのウインドウを拡大対象にしていたかはWindowsの仕様上管理用のIDが変化するため保存しません。

といった感じですかね。
詳しくは同梱しているリードミーテキストを読んでください。

さてと、何とか今週中にはサイトリニューアルを完成させないと…!

更新作業中ですが

2017-02-19-Sun-23:16
ついでにレイアウト変更もしようとした結果、
全ページの完成が間に合わなかったのでもうしばらくお待ちください。
せっかくなのでブログのフォントもメイリオにしました。

もしかしたら1月1日更新は初かも

2017-01-01-Sun-22:30
あけおめ2017
日記マンガ
と、とりあえずwaiei2を正式公開できるように…!




A.Cです。
あけましておめでとうございます!
今年もよろしくお願いします!

これ描いてて気づいたんですけどペンタブのUSB線が切れそうなんですよね。
中の配線が見えている状態…これは怖い。

とりあえず新年早目の更新をしようとしたら
ついに1日に更新ができました!
たぶん1月1日更新はブログ開設から初めてだと思います!
まあ問題は次の更新なので
せめて月1は更新できるように頑張っていきたいなと思います。

ではでは、今年もよろしくお願いします!
RREVHOME NEXT