カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2018年10月12日(金)

schtasks.exe /XML オプションについて

schtasks.exe を使うと、タスクの管理を
コマンドラインから行うことができます。

タスクとは、定期的に実行したいプログラムのことです。

対話的に画面でタスクの設定をするには、
タスクスケジューラーというアプリを使いますが、
そのコマンドラインバージョンみたいなものです。

で、/XML オプションを使うと、
新しいタスクの設定を XML ファイルで指定したり、
既存のタスクの設定を XML 形式で出力することができます。

ところが、コマンドラインで出力される、あるいは入力する
XML ファイルには癖があったので、ちょっと書いときます。

自分の環境の場合、XML の文字コードは、
たぶんですが、シフト JIS です。

ところが、XML 内の encoding は、"UTF-16" になってます。
すなわち、文字コードが不正な XML が出力されます。

最初、何故そうなるのか、全然わからなかったのですが、
たぶん、こういうことでしょう。

schtasks は、UTF-16 の XML を生成しますが、出力前に、
コマンドラインの文字コードに変換してから出力します。

その際、ファイルの中身を正しく変更しないので、
encoding=UTF-16 のまま、シフトJIS のファイルが出力されます。

schtasks.exe に XML を入力するときも同様なので、
encoding=UTF-16 でありながら、
シフトJIS でエンコーディングされている
ファイルを入力しないとうまくいきません。

ま、シフトJIS じゃないとコマンドラインでは
(ディフォルトの状態では) 正しく表示できないから、
そういう仕様なのでしょうが、微妙な仕様ですね。

ちなみに、改行コードも、
謎の 0D 0D 0A で出力されます。
いい加減な仕事するわーw。

ご意見・ご要望連絡窓口


2018年09月21日(金)

【win32】ダイアログパネルを表示スケールに対応する方法

SVG での出力も可能な、イラストレーター ソフト「ストローク」
の改良中。ミルノ と同様に、表示スケールに対応するつもりです。

今日は、ダイアログパネルを表示スケールに対応する作業をしました。

ダイアログパネルは、他のウィンドウの「子ウィンドウ」
として表示するダイアログのことを表しています。

ストロークでは、新しい線パネルなどのことです。

普通のダイアログと同様、適切なマニフェストを
アプリケーションに設定すると表示スケールの変更に
追従してレイアウトが自動的に更新されますが
ダイアログ全体のサイズは変化しないようです。

対応するには、WM_DPICHANGED メッセージ
で、ダイアログのサイズを変更します。

ただ、ダイアログパネルにはこのメッセージが
来ないので、ダイアログパネルのトップレベル
ウィンドウのメッセージに応じて、処理します。

サイズは、ダイアログテンプレートから取得できます。
DLGTEMPLATEEX 構造体 の cx、cy です。

ただ、この値は、特殊なダイアログ単位と呼ばれるものなので、
MapDialogRect 関数 でピクセル単位に変換する必要があります。

私の環境 (Windows 10、PerMonitorV2 のマニフェスト) では、
表示スケールに応じた正しい値に変換できるみたいでした。

あとは、 SetWindowPos 関数 などで
ウィンドウサイズを変更すれば OK です。

・・・

表示スケールには、まだ対応してないバージョンですが、
SVG エディター、ストロークはこちらからダウンロードできます

・・・

もちっとで、できるかな。

ストローク
ストローク ダウンロード
ストローク サンプル画像
ストローク 更新履歴
ご意見・ご要望連絡窓口


2018年09月04日(火)

ツールバーのサイズを動的に変更する方法 (Windows API, win32)

SVG での出力も可能な、イラストレーター ソフト「ストローク」
の改良中です。ミルノ と同様に、表示スケールに対応するつもりです。

今日は、ツールバーのサイズを
動的に変更する機能ができました。

メニューのフォントサイズに合わせて、
ツールバーの大きさも変化します。

ちょっち、苦労したので、コツを書いときます。

ツールバーの画像を変更する

画像を変更するには、
TB_SETBITMAPSIZE してから、
TB_SETIMAGELIST します。

TB_SETBITMAPSIZE には、
画像を 1 つもセットしてないときにだけ、
サイズをセットできると書いてあるので、
TB_SETBITMAPSIZE が先です。

説明を厳密にとらえると、セット済みの画像を「無くしてから」
TB_SETBITMAPSIZE した方がよさそうですが、
そうしなくても大丈夫みたいです。

リソースの管理はこちらにまかされているので、
古いイメージリストは、ImageList_Destroy しましょう。

ツールバーボタンのサイズを変更する

次に、TB_SETBUTTONSIZE して新しいボタンサイズを設定します。
ボタンを追加した後に呼びだせ、とあるので、ま、大丈夫でしょう。

これで、ツールバーのボタンの高さが
変更されますが、何故か幅が変わりません。

TB_AUTOSIZE すれば OK そうですが、ダメです。

ちょっと調べてみると、ボタンを追加した直後の「ボタンの幅」を、
TB_GETBUTTONINFO で取得すると全て 0 ですが、
ツールバーを表示した後は、有効な値になるみたいです。

そこで、 TB_SETBUTTONINFO でボタンの幅を全て 0 に設定してから、 TB_AUTOSIZE してみると、正しい幅になりました。

ツールバーのサイズを変更する

最後に、ボタンの高さを大きくした場合、
ウィンドウの高さが足りないとボタンが表示されなくなるので、
ツールバーウィンドウの大きさも調整する必要があります。

・・・

ツールバーを大きくする機能は、まだありませんが、
SVG エディター、ストロークはこちらからダウンロードできます

・・・

ちなみに、ボタンを作り直してもうまくいきます。

ストローク
ストローク ダウンロード
ストローク サンプル画像
ストローク 更新履歴
ご意見・ご要望連絡窓口


2018年08月03日(金)

ミルノ PC フォトフレーム、マウスカーソルを「表示スケール」に対応させるには

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

今日は、「表示スケール」に対応して
マウスカーソルを大きくする機能を実装しました。

まず、::LoadCursor(NULL, IDC_ARROW);
ってな感じでロードする標準のカーソルは、
表示スケールに合わせて勝手に大きくなるみたいです。

一方、::LoadCursor(hInstance, ...);
でロードするアプリケーション固有のカーソルは
自動的に大きくならないため、表示スケールの変更に応じて
ロードし直す必要がありそうです。

現在のアイコンのサイズを調べる

標準のカーソルがどう大きくなるか、調べてみると、
125 % では変わらず、150 %、175 % で 1.5 倍になりました。

おそらく、50 % ごとに大きくなる仕様なのでしょう。
すなわち、dpi * 32 / 96 ってな式では計算できません。

このへんは、OS のバージョンによって挙動が変わりそうなので、
現在のマウスカーソルの大きさを取得できるとよいのですが
結論からいうと、あまりうまくいく方法が見つかりませんでした。

ま、しょうがないので、今のところ dpi から計算してます。
プログラムはこんな感じです。

if (dpi <= 96)
  return size;

int multi2 = ::MulDiv(dpi - 96, 2, dpi);
return size + multi2 * size / 2;

multi2 はサイズの増分の比率の 2 倍です。
0.5 単位で大きくなるので、0.5 が
整数の 1 になるように 2 倍してます。

サイズを指定してカーソルをロードする

.cur ファイルをリソースに用意して、
LoadImage にサイズを指定してロードしてみると、
何故か、指定のサイズよりも小さいカーソルとなりました。

Windows 10 に標準で入っている、cur ファイルを
パスに指定してロードした場合も、
同様に小さくなったので、
そういう仕様なのでしょう。

正直、意味不明なので、cur ファイルはあきらめて、
ico ファイルを読み込んで、カーソルに変換する方法をとりました。

アイコンを LoadImage でロードし、
GetIconInfo で取得した情報を編集し、
CreateIconIndirect に渡すと、カーソルを作成できます。

ICONINFO.fIcon には、FALSE を指定します。
ICONINFO.xHotspot、ICONINFO.yHotspot
でホットスポットを設定できます。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

うーん、カーソル回りの仕様は、
意味不明なことが多すぎる。

どうなってんだーーー。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月26日(木)

Windows API、プロパティシートのフォントを変更する

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

プロパティシートのフォントを変更する方法です。

プロパティシートの共通部分のフォント

プロパティシートのタブ、OK ボタン、キャンセルボタン
のフォントを変更するには、プロパティシートの
コールバック関数に送られる PSCB_PRECREATE
メッセージで、DLGTEMPLATE 構造体を書き換えます。

構造体にアクセスするには、
LPDLGTEMPLATE p = (LPDLGTEMPLATE)lParam;
てな感じです。

割り当てられているメモリー領域より後ろに
書き込むと、バッファーオーバーランになります。

が、どの程度余剰があるのかは、わかりません。

自分の環境では、構造体の後に、240 バイトくらい
値が 0 の領域がありましたが、0 だからといって
使われていないとも限りませんし、
OS によっても異なるかもしれません。

なので、フォント名などの可変長データーを
書き換えるのは、危険だと思われます。

タブ内ページのフォント

各タブのフォントを変更するには、各ページの PROPSHEETPAGE の pResource にテンプレートリソースへのポインターを指定し、
dwFlags に PSP_DLGINDIRECT を立てると、
メモリー上のリソースから、ダイアログを作成できます。

後は、普通のダイアログと同じように、
テンプレートをメモリー上に読み込み、
編集してから、pResource に指定すれば OK ですね。

テンプレートリソースの編集は、
DWORD 境界の問題があって、結構やっかいですが、
注意深くやればできるでしょう。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

タブや OK ボタンのフォント名も変更できたけど、
どのくらいのサイズまで、メモリーを利用して
いいのかわからないから、変更できないわ。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月23日(月)

Windows API、ダイアログテンプレートを動的に変更する

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

ダイアログをユーザー指定のフォントで表示するために、
ダイアログのリソーステンプレートを動的に書き換えてみました。

メモリー上にリソーステンプレートを読みこみ、
編集してから、CreateDialogIndirect を呼び出せば OK です。

WTL の場合、CIndirectDialogImpl を使うと実現できます。

あとは、ダイアログリソースをメモリー上に読み込む方法と、
編集する方法がわかれば、実装できるでしょう。

ダイアログリソースを読み込む

FindResource して、
LoadResource して、
LockResource すると、
リソースへのポインター、サイズが得られるので、
編集のため、適当なメモリー領域にコピーします。

FindResource の lpType には、RT_DIALOG を指定します。

ダイアログリソースを編集する

リソースを DIALOGEX で定義した場合、
リソースの構造は、 DLGTEMPLATEEX です。

可変長フィールドがあるので、
前からオフセットを計算していく必要があります。

可変長フィールドを編集する場合、
それより後のメモリー領域を
移動する必要があり、結構面倒です。

DLGTEMPLATEEX の説明をよくよむとわかりますが、
アイテムの構造体 DLGITEMTEMPLATEEX のオフセットは、
DWORD 境界にそろえる必要があります。

DWORD 境界にそろえるとは、
4 の倍数にするということです。

例えば、DLGTEMPLATEEX のサイズが 3 だった場合、
(そんなに小さいサイズにはなりえませんが)
次の DLGITEMTEMPLATEEX は 1 バイトのゴミをはさんで、
オフセット 4 から記録する必要があります。

また、menu, windowClass, title, and typeface
は WORD 境界に合わせよと書いてありますが、
BYTE 型の italic、charset は連続して 2 バイトを成してますし、
sz_Or_Ord 型も 2 バイト単位のデーターなので、
特に何も考えなくとも、WORD 境界になるはずです。

DLGITEMTEMPLATEEX のメンバーの
オフセットについても同様なので、
DLGITEMTEMPLATEEX の先頭オフセットにだけ
注意すれば大丈夫でしょう。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

メモリーを直接編集するのは、
パディングのせいで、かなり面倒だった。

プログラムで編集しやすい形式に変更してから値を変更し、
メモリーに展開しなおした方が、素直なコードになりそうです。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月19日(木)

Windows API、表示スケールが変わると、テーマのハンドルが無効になります

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

タイトルの通り、OS の表示スケールを
変えると、テーマのハンドルが無効になります。

テーマのハンドルとは、
OpenThemeData の返り値です。

ハンドルが無効になることは、
OpenThemeDataForDpi の方に書いてあります。

現時点では、何故か、関数プロトタイプの返り値が
void になってますが、HTHEME の間違いですね。

ハンドルが無効になるタイミングは、
WM_DPICHANGED メッセージでわかります。

このメッセージは、トップレベルの
ウィンドウにのみ届くみたいですなので、
そのタイミングで、ハンドルを開き直すか、
後で開き直すために、 CloseThemeData しましょう。

もし、描画速度が気にならないのであれば、
描画の度に、OpenThemeData して、
ハンドルをキャッシュしない
手もあるかもしれません。

ちなみに、自分の環境では、表示スケールを変えた後で、
HTHEME を開き直さずに、描いた場合、
描けたり、描けなかったりしました。

不具合が見つけづらいので、ご注意ください。

おまけ

ちなみに、 WM_THEMECHANGED メッセージが届いたときも、
HTHEME は無効となります。

このメッセージは子ウィンドウにも届くみたいなので、
HTHEME を使って描画するコントロールの
コードで対応できると思います。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

例えば、Windows 10 の場合、ハイコントラスト
にしたときに、WM_THEMECHANGED が届きます。

この場合、オープン済みの HTHEME は無効となり、
テーマの機能も無効になるので、OpenThemeData
で開き直すと NULL になります。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月17日(火)

Windows API、アイコンリソースに含まれる全てのアイコンのサイズを列挙する方法

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

アイコンリソース (ICON) には、
複数のサイズの画像を含めることができます。

となれば、アイコンリソースに含まれている
全ての画像のサイズを列挙したくなるのが人情ってものですw。

アイコンリソースの画像のサイズを全て列挙する

まんまの Windows API は無いみたいなので、
アイコンリソースをロックして
メモリーを参照する必要があります。

FindResource して、
LoadResource して、
LockResource すると、
メモリーの内容が見れます。

解放する必要もないので、そんなに難しくはないです。

FindResource の lpType には、
RT_GROUP_ICON を指定します。

で、 The format of icon resources - The Old New Thing
にある GRPICONDIR* にキャストすれば OK です。

GRPICONDIRENTRY は、Icons にある
ICONDIRENTRY とは微妙に違うので注意です。

最後の、DWORD dwImageOffset が
WORD nId になってるので、
2 バイト少ないです。

ちなみに、構造体にパディングが入るとダメなので、
構造体の宣言の前で、
#pragma pack(1)
し、終わったら、
#pragma pack()
で、ディフォルトの値に戻してあげましょう。

ま、後は大丈夫と思いますが、アイコンの数は、
ポインターが GRPICONDIR* info だとすると、
info->idCount で取得できます。

各アイコンのサイズは、
info->idEntries[i].bWidth
info->idEntries[i].bHeight
ですね。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

パネルを固定するピンボタンは、拡縮でぼやけさせたくないので、
アイコンリソースに含まれる画像サイズを列挙したいなー
と思ったら、結構大変でした。

アイコンに含まれる画像サイズは
既に知ってるわけだから、どこかに
配列で書いちゃえば楽ですね。

でも、そうすると、アイコンに含まれる
画像サイズのバリエーションを変更したときには、
配列も忘れずに書き替える必要がでてきます。

とはいえ、画像サイズのバリエーションを
一生変更しなかった場合、コーディングに無駄な時間
がかかるため、どちらがいいかは、わかりませんな。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月13日(金)

Windows API、モニター毎の DPI に合わせてウィンドウのアイコンを更新する

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

今日も、高 DPI 環境に対応するための処理を
コツコツと書いてました。なんとなく
予感していた通り、結構大変です。

今日は、ウィンドウキャプション
についての記事を書きますわ〜。

まず、ウィンドウキャプションを
モニター毎の DPI に対応させるには、
アプリケーションのマニフェストに、
Per-Monitor and Per-Monitor (V2) DPI Awareness
を追加すれば OK です。

V2 のマニフェストのサンプルは
下記ページにあったので、参考にしました。

Application Manifests | Microsoft Docs
Application manifest for Per Monitor V2 · GitHub

ただし、PerMonitorV2 は、Windows 10 でしか
認識されないので、Windows 8.1 とかで、
完全に Per-monitor 環境に対応するには、
キャプションを独自で描画する必要がありそうです。

話を戻して、Windows 10 の最新バージョンで
アプリを動かす場合は、V2 のマニフェストを
用意するだけでキャプションも正しく描画されるのですが、
場合によっては、左端のアイコンがぼやけます。

というわけで、ぼやけさせたくない場合は、
キャプションのサイズに合わせた、
アイコンに更新する必要があります。

キャプションのアイコンを更新する

メインウィンドウの DPI に変更が生じた場合、
WM_DPICHANGED メッセージが発生するので、
これのメッセージハンドラーでアイコンを更新します。

キャプションのアイコンのサイズは、
GetSystemMetrics に、
SM_CXSMICON、SM_CYSMICON
を指定すると取得できます。

が、起動時の (おそらくはプライマリーモニターの) DPI に
応じた値が返るので、補正する必要があります。

起動時の DPI は ↓ のようなコードで取得できます。

CWindowDC dc(NULL);
m_systemDpis.x = dc.GetDeviceCaps(LOGPIXELSX);
m_systemDpis.y = dc.GetDeviceCaps(LOGPIXELSY);

一方、現在の DPI は、
CPoint dpis(LOWORD(wParam), HIWORD(wParam));
で取得できます。

wParam は、WM_DPICHANGED のパラメーターです。

補正するには、現在の DPI をかけてから
起動時の DPI を割れば OK です。
newValue = ::MulDiv(value, dstDpi, srcDpi);
みたいなコードになります。

で、新しいサイズでアイコンをロードしてから
再設定すれば OK です。

例えば、 LoadImage 関数 の cxDesired、cyDesired
に新しいサイズを指定して読み込み直します。

最後に、メインフレームに WM_SETICON メッセージ
を送って、アイコンを更新します。

今、更新しているのは小さい方のアイコンなので、
wParam には ICON_SMALL を指定します。

大きい方のアイコンを更新する

キャプションには直接影響しませんが、
大きい方のアイコンも合わせて
更新しておいた方がいいかもしれません。

大きい方のアイコンを更新するには、
WM_SETICON の wParam には ICON_BIG を指定します。

で、アイコンサイズの取得には、
SM_CXSMICON、SM_CYSMICON のかわりに
SM_CXICON、SM_CYICON を使います。

後の処理は、だいたい同じです。

アイコンのリソースを更新する

まだ、ぼやける場合は、たぶんリソースの問題です。

LoadImage するリソースが ico ファイルの場合は、
いろいろなサイズの画像を含めておくと、ぼやけません。

例えば、ディフォルトの 16、32 の大きさだけでなく、
20、24、48、256 なんかも用意しておきましょう。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

High DPI Desktop Application Development on Windows
に WM_DPICHANGED は、both the top-level and child
にくるって書いてあるけど、嘘っぽいな。

WS_CHILD の純粋な子には、来なかった。

top-level をオーナーに持つ
ポップアップウィンドウにはきたから、
そういう意味なのかもね?

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2018年07月10日(火)

Windows API、ウィンドウクリック時にアクティブ化しないようにする

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

Windows API の TrackPopupMenu
モニター毎の DPI に対応していないので
自作のポップアップメニューを改良中です。

自作のポップアップメニューとは、
ウィンドウの描画やマウスメッセージの処理など、
全て自分のコードで行うものです。

で、今日困ったのが、自作のポップアップメニューを
クリックしたときに、メニューにフォーカスが来てしまう問題です。

フォーカスは、メニューを表示したときのまま、
メニューのウィンドウは取得しないのが正しい挙動です。

色々と試しましたが、うまくいった方法は次の通り。

フォーカスを阻止する方法

ポップアップウィンドウに届く、
WM_MOUSEACTIVATE メッセージに、
MA_NOACTIVATE を返します。

これだけで OK です。

ポップアップメニューは、オーナーウィンドウの
外に、はみだして表示する必要があるので、
必然的に、トップレベルウィンドウになります。

トップレベルウィンドウは、クリックすると、
ディフォルトの挙動ではアクティブになるので、
MA_NOACTIVATE で防ぎます。

フォーカスは、アクティブ化の副作用で発生するので、
アクティブ化を阻止すれば、フォーカスも発生しません。

その他の試した方法1

よくわかりませんが、ウィンドウの拡張スタイルに、
WS_EX_NOACTIVATE を設定する方法は効きませんでした。

効かなかった原因は不明です。

その他の試した方法2

WM_ACTIVATE で、メニューがアクティブ化したときに
元のウィンドウを、SetActiveWindow しても
一回アクティブになっちゃってるので、
フォーカスが発生しちゃいます。

その他の試した方法3

WM_SETFOCUS メッセージで、
元のウィンドウを、SetFocus すると
フォーカスを元に戻せますが難点があります。

元のフォーカス先のウィンドウ (のルート) がアクティブ化し、
最前面にくるので、メニューのウィンドウが
z オーダー的に、後ろに隠れちゃいます。

SetFocus した後、むりやり z オーダー
を調節できますが、ちらつきます。

メニュー表示元のウィンドウが
「最前面」で無い場合は、メニューを
最前面にするとちらつきを抑制できますが、
表示元が「最前面」の場合は回避不能です。

また、フォーカスが一瞬は移動するので、
フォーカスのあるなしで描画が変わる
ウィンドウも、ちらつきます。

例えば、ツリービューはフォーカスがある状態では
選択項目が「青色」ですが、フォーカスが無いと
「灰色」になるため、ちらつきます。

おまけ

トリッキーな方法を使うと、
フォーカスを戻したウィンドウの後ろに
メニューが一瞬隠れる「ちらつき」は回避できました。

その方法は、フォーカスを戻す先のウィンドウの
トップレベルウィンドウのウィンドウプロシージャーで、
WM_WINDOWPOSCHANGING メッセージの処理をいじります。

具体的には、ポップアップメニューをクリックした場合のみ
SWP_NOZORDER フラグを立てて、z オーダーの変更を阻止します。

ただ、この方法はフォーカスの戻し先の
ウィンドウプロシージャーをいじる必要があるので、
あまり、よい解決方法にはならないでしょう。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

WM_SETFOCUS のところで
なんとかしようとしてたら、
無駄に、時間かかったわー。

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


| 1/6PAGES | >>