WM_CLOSEについて

[戻る]
シジミ 2006/07/09(日) 01:39:01
機種はWindowsXPです。
常駐プログラムにいかのような作業をさせたところ、

SendMessage(GetForegroundWindow(),WM_CLOSE,NULL,NULL);

普通のアプリケーションなら、一番手前のウィンドウが閉じるのですが、
エクスプローラーのウィンドウは閉じてはくれません。

送るメッセージが違うのか、送り方が悪いのか、それともエクスプローラーが拒否して
いるのか原因が分かりません。

どなたか、ご存じの方教えてください。

Blue 2006/07/09(日) 02:08:54
エクスプローラを閉じたい場合は、WM_CLOSEではなく
WM_SYSCOMMANDでSC_CLOSEを指定しないとダメらしいです。

ですので、

HWND hWnd = ::GetForegroundWindow();
if ( hWnd )
{
    TCHAR szClassName[ 256 ];
    ::GetClassName( hWnd, szClassName, 256 );
    if ( !_tcscmp( szClassName, _T( "ExploreWClass" ) ) || 
         !_tcscmp( szClassName, _T( "CabinetWClass" ) ) )
    {
        ::SendMessage( hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L );
    }
    else
    {
        ::SendMessage( hWnd, WM_CLOSE, 0L, 0L );
    }
}

てな、感じでしょうか。

んー 2006/07/09(日) 02:10:04
直接の回答じゃないけど、SPY++で見てみれば?

エクスプローラの×クリックしたらWM_CLOSE飛んでたよ
(SendMessageじゃなくPostMessageだったけど)

んー 2006/07/09(日) 02:12:44
書いてる間にレスが…
確かにWM_SYSCOMMAND (SC_CLOSE)も飛んでますね

シジミ 2006/07/09(日) 13:43:37
[[解決]]
有り難うございました。
ウィンドウメッセージは多すぎて全部把握できていませんでした。
確かに、SPY++では飛んでましたね。
Blueさんのようにやると、閉じました。
いやあ、奥が深いですね。

古いスレッドには追加発言できません。