ab.com コミュニティ
https://www.activebasic.com/forum/

ディスクトップ画面の更新方法
https://www.activebasic.com/forum/viewtopic.php?t=2470
ページ 11

作成者:  みーあん [ 2008年9月02日(火) 23:56 ]
記事の件名:  ディスクトップ画面の更新方法

ディスクトップ画面の更新がうまく出来なくて悩んでます。

作成してるのは、隠しフォルダの表示・非表示を切り替えするソフトです。隠しフォルダの表示・非表示を切り替えはレジストリを変更する方法で出来たのですが、ディスクトップの更新出来ません。
表示の更新も実現したいのですが、出来なくて困っています。隠れフォルダの表示・非表示の変更は、ディスクトップでマウス右ボタンのメニューの「最新の情報に更新」で確認出来てますのでレジストリの変更は成功していると思います。

実際のコードは、
コード:
dim regSubKey as String
dim hRegkey as HKEY
dim Dat_Hidden as DWord
    regSubKey = "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
    Dat_Hidden = 1

'レジストリの変更
    RegOpenKeyEx(HKEY_CURRENT_USER,rgSubKey,0,KEY_SET_VALUE,hRegkey)
    RegSetValueEx(hRegkey,"Hidden",0,REG_DWORD,VarPtr(Dat_Hidden),4)

'ディストップの表示の更新
    InvalidateRect(GetDesktopWindow() , ByVal NULL , FALSE)
    UpdateWindow(GetDesktopWindow())
ディスクトップの更新には、InvalidateRect()とUpdateWindow()を使って見ましたが、うまく出来ませんでした。更新の方法を教えてください。
また、レジストリの変更でない方法があるのでしたら、その方法も教えて下さい。

よろしくお願いします。

作成者:  popopo(^^) [ 2008年9月15日(月) 16:04 ]
記事の件名:  デスクトップの更新

>ディスクトップの更新には、InvalidateRect()とUpdateWindow()を使って見ましたが、うまく出来ませんでした。
みーあんさん、デスクトップに表示されているファイル一覧
を最新の状態にしたいんですよね?
InvalidateRectとUpdateWindowはそういう用途には関係ない
(UpdateWindowはウインドウにWM_PAINTを送るだけ、
InvalidateRectは再描画を要求するだけです。)
ですので、他の方法を・・・・
と言いたいところですが、ちょっと時間がないので。
他の人がそのうち書いてくれると思います。(^^;

作成者:  popopo(^^) [ 2008年9月19日(金) 16:30 ]
記事の件名:  デスクトップの更新

popopoです。思いついたので書きます。
(超原始的ですが)
コード:
Dim hDesktopWnd As HWND,a As Long

hDesktopWnd=FindWindow(NULL,"Program Manager")
SetForegroundWindow(hDesktopWnd)'アクティブにする
keybd_event(VK_F5,0,0,0)'F5キーを押す
keybd_event(VK_F5,0,KEYEVENTF_KEYUP,0)'離す
これでどうでしょう?
試してみた所、ちゃんと動いたっぽいですが・・・
あと、終わった後に自分のウインドウ(hMainWndなど)を
アクティブにしてください。

作成者:  みーあん [ 2008年9月22日(月) 21:51 ]
記事の件名: 

popopo(^^)さん、返信ありがとうございます!
そして、返信遅くなってすみません。

>みーあんさん、デスクトップに表示されているファイル一覧を最新の状態にしたいんですよね?
おっしゃる通りです。
>InvalidateRectとUpdateWindowはそういう用途には関係ない (UpdateWindowはウインドウにWM_PAINTを送るだけ、InvalidateRectは再描画を要求するだけです。)
なるほど、用途がちがうのですね、なんとなくですがわかりました。

>popopoです。思いついたので書きます。
>(Codeは略)
Codeありがとうございます。
結果ですが、うまくいきませんでした。正確には隠しファイルの表示・非表示のレジストリの変更後、教えてもらったCodeを実行すると最初の一度は反映され成功するのですが、二度目以降はデスクトップ画面が再描画(ちらつく?)だけです。
一定間隔のタイマー設定みたいなものがあるのかとかいろいろやってはいるのですが、解決には結びついていません。
でも、ヒントになりそうな事があったので書きます。
1.「マイコンピュータ」などのエクスプローラを表示した状態で、「クイック起動」の「デスクトップの表示」クリックでデスクトップを表示し、再度「デスクトップの表示」クリックで元の状態を表示した後だと教えてもらったCodeを実行すると必ず成功する。
2.(1)の方法で、エクスプローラを表示してないと成功しない。
3.デスクトップでの「F5」キーは(1)と同じ状態で連続で反映されない。しかし、マウス右クリックメニューの「最新の状態に更新」では毎回反映される。
以上です。ここら辺りがヒントになるような気はするのですが・・・謎のままです。
何かわかりましたら、返信おねがいします。


順番が後になりましたが、環境を書いて無かったので書きます。(opopo(^^)さんは成功してるみたいなので、環境の差もあるのかなと思ったり)
デスクトップ:Athlon64x2(gf6100am2)winXPsp3
ノート:PenIII600(440BX)win2Ksp4
どちらともActiveBasic4.24です。

作成者:  popopo(^^) [ 2008年9月23日(火) 10:24 ]
記事の件名:  残念です

成功しなかったようですね。
きちんと調べてなくてすいません。
>1.「マイコンピュータ」などのエクスプローラを表示した状態で、「クイック起動」の「デスクトップの表示」クリックでデスクトップを表示し、再度「デスクトップの表示」クリックで元の状態を表示した後だと教えてもらったCodeを実行すると必ず成功する。
>2.(1)の方法で、エクスプローラを表示してないと成功しない。
>3.デスクトップでの「F5」キーは(1)と同じ状態で連続で反映されない。しかし、マウス右クリックメニューの「最新の状態に更新」では毎回反映される。
どうなってるのでしょう・・・・。
よくわかりません(^^;
でも、右クリックメニューの「最新の状態に更新」で出来るのなら、
このコードを少し改造すればいけるかもしれません。
これでどうでしょう?
コード:
Dim hDesktopWnd As HWND,a As Long

hDesktopWnd=FindWindow(NULL,"Program Manager")'デスクトップウインドウを取得

SetForegroundWindow(hDesktopWnd)'アクティブにする
keybd_event(VK_APPS,0,0,0)'APPSキーを押す
keybd_event(VK_APPS,0,KEYEVENTF_KEYUP,0)'離す
keybd_event(Asc("E"),0,0,0)'Eキーを押す
keybd_event(Asc("E"),0,KEYEVENTF_KEYUP,0)'離す
右クリックメニューを表示し、Eキーを押すプログラムです。
でも、もうちょっとエレガントな方法はないでしょうか?
一瞬チラッと右クリメニュがでますし、
環境によっては、出ないかもしれません。

作成者:  みーあん [ 2008年9月27日(土) 13:26 ]
記事の件名:  ディスクトップ画面の更新方法

popopo(^^)さん、返信ありがとうございます。しかも早い!

結果ですが、成功しました。確かに一瞬チラッと右クリメニュがでますが、ちゃんと隠しファイルの表示・非表示が出来てますので希望してた動作です。
ただ、デスクトップ上のアイコンが選択された状態の場合は、アイコンに対する右クリックのメニューが表示されたままになります。この事は調べてみます。どうしてもわからなかったら、また質問させて下さい。

なんとか先が見えて気ました。ありがとうございました。

お礼と言うわけではないですが、自分なり出来たCodeをそのうち記載させてもらいます。力不足なんで何時出来るかわかりませんが・・・

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/