- ベストアンサー
DEVICECHANGE() の受け取り
常駐し、USBメモリなど追加された場合を検出したいです。 どうしたらいいでしょうか? 次のソースでwin32空きプロジェクトを作成します。 #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { return 0; } ON_WM_DEVICECHANGE() というメッセージを受け取るそうですがどうしたらいいでしょうか? 例えば、USBドライブを検出した場合、メッセージを表示するようにしたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <windows.h> static LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM); static void reg(); int WINAPI WinMain(HINSTANCE ci,HINSTANCE pi,LPSTR cp,int sw) { MSG m; reg(); while(GetMessage(&m,NULL,0,0)) { TranslateMessage(&m); DispatchMessage(&m); } return 0; } static void reg() { WNDCLASSEX w; char c[] = {"a"}; memset(&w,0,sizeof(w)); w.cbSize = sizeof(WNDCLASSEX); w.lpfnWndProc = (WNDPROC)WndProc; w.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); w.lpszClassName = c; RegisterClassEx(&w); HWND h = CreateWindow(c,"監視",WS_OVERLAPPEDWINDOW, 0,0,0,0,NULL,NULL,NULL,NULL); ShowWindow(h,SW_MINIMIZE); } static LRESULT WINAPI WndProc(HWND h,UINT m,WPARAM w,LPARAM l) { switch(m) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_DEVICECHANGE: //★ここに処理を書く return 戻り値; } return DefWindowProc(h,m,w,l); } >どうすればメッセージをとれるか? メッセージは勝手に飛び込んでくるのです。それを待ち構えます。 WindowsのGUIプログラムは受け身で物を考えないといけません。 このプログラムは×で閉じます。だから「常駐」ではありません。 ★のところは別途調べてください。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1416)
ウィンドウプロシージャでWM_DEVICECHANGEというメッセージを 処理します。 http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1858697&SiteID=7 >常駐 この手のプログラムですと、サービスとして常駐させるのが普通です。 サービスの開始エントリで、非表示ウィンドを作り、それのウィンドウ プロシージャでWM_DEVICECHANGEを扱います。 サービスの終了エントリでWM_CLOSEを自Windowに投げるようにします。
お礼
ダイアログベース物で昔、ウインドウ初期化前にいろいろ処理してしまい、 終了させてしまう。というのをやったことがあります。 動くには動きましたが・・・これじゃ本来ダメですよね。 MSサイトとか見たのですが知識が古い物でして。 MFCを使わないプログラムはやったことありません。 どうすればメッセージをとれるか?がわかりません。
- arain
- ベストアンサー率27% (292/1049)
>ON_WM_DEVICECHANGE() >というメッセージを受け取るそうですがどうしたらいいでしょうか? CWnd::OnDeviceChange()のマクロなので、OnDeviceChange()を実装する。 とりあえず確認ですが、Windowsアプリの作成経験と、メッセージハンドラの捕まえ方とか知ってますか? 質問のように、ウイザードで作成されたWinMain()の空関数提示されるたげじゃ丸投げに見えますよ。
お礼
MFCを使った物であればVC6まで経験あるのでわかるんですが、 .NETに変わって関数ウイザードとか無くなったのでわかりません。 WM_のとらえ方もわかりません。
お礼
ありがとうございます。 MFCからではメッセージの受け取りに成功し、プレークポイントで 確認できました。 このソース確かめてみます。 結果は連休明けになってしまいます。すみません。 ウインドウを表示しない。 タスクバーにも表示させなければそれでいいんですよね。 調べていたら、プロセス隠蔽というテクニックもあるみたいですね。 タスクマネージャのプロセスに表示さらせない方法も。