• ベストアンサー

DEVICECHANGE() の受け取り

常駐し、USBメモリなど追加された場合を検出したいです。 どうしたらいいでしょうか? 次のソースでwin32空きプロジェクトを作成します。 #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { return 0; } ON_WM_DEVICECHANGE() というメッセージを受け取るそうですがどうしたらいいでしょうか? 例えば、USBドライブを検出した場合、メッセージを表示するようにしたいです。

  • 5S6
  • お礼率59% (1504/2542)

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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プログラムは受け身で物を考えないといけません。 このプログラムは×で閉じます。だから「常駐」ではありません。 ★のところは別途調べてください。

5S6
質問者

お礼

ありがとうございます。 MFCからではメッセージの受け取りに成功し、プレークポイントで 確認できました。 このソース確かめてみます。 結果は連休明けになってしまいます。すみません。 ウインドウを表示しない。 タスクバーにも表示させなければそれでいいんですよね。 調べていたら、プロセス隠蔽というテクニックもあるみたいですね。 タスクマネージャのプロセスに表示さらせない方法も。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

ウィンドウプロシージャでWM_DEVICECHANGEというメッセージを 処理します。 http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1858697&SiteID=7 >常駐 この手のプログラムですと、サービスとして常駐させるのが普通です。 サービスの開始エントリで、非表示ウィンドを作り、それのウィンドウ プロシージャでWM_DEVICECHANGEを扱います。 サービスの終了エントリでWM_CLOSEを自Windowに投げるようにします。

5S6
質問者

お礼

ダイアログベース物で昔、ウインドウ初期化前にいろいろ処理してしまい、 終了させてしまう。というのをやったことがあります。 動くには動きましたが・・・これじゃ本来ダメですよね。 MSサイトとか見たのですが知識が古い物でして。 MFCを使わないプログラムはやったことありません。 どうすればメッセージをとれるか?がわかりません。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>ON_WM_DEVICECHANGE() >というメッセージを受け取るそうですがどうしたらいいでしょうか? CWnd::OnDeviceChange()のマクロなので、OnDeviceChange()を実装する。 とりあえず確認ですが、Windowsアプリの作成経験と、メッセージハンドラの捕まえ方とか知ってますか? 質問のように、ウイザードで作成されたWinMain()の空関数提示されるたげじゃ丸投げに見えますよ。

5S6
質問者

お礼

MFCを使った物であればVC6まで経験あるのでわかるんですが、 .NETに変わって関数ウイザードとか無くなったのでわかりません。 WM_のとらえ方もわかりません。

関連するQ&A

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • 画像が出力されません

    画像出力するには int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); から引数"lpCmdLine"を使うことにより画像が出力できる事を聞いたのですが本当でしょうか? うまく出力できません どのようにしたらよいのか具体的にソースをつけて教えてください。 画像はraw画像で出力します

  • lpCmdLineについて

    #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION); return 0; } とやったのですが、lpCmdLineのパスが表示されません。なぜでしょうか?

  • 外部シンボル "_main"は未解決です

    「LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です」というエラーが発生しましたが、何をみればいいのかわかりません。int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )がソースについています。

  • VS2019でWinMainエラー発生

    以下メッセージを表示するだけのプログラムですが、以前はビルドできたのですが、VS2019になってからWinMainで「整合性のないインスタンス・・・」とエラーが出ます。なんででしょうか。 お願いします。 またVCをVBSみたいに黒い画面が出ずに引数を使用したいですが、その他アドバイスもお願いします。 #include <windows.h> int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION ); return 0; }

  • Windowsゲームプログラミングを始めたのですが

    最近ゲームのプログラムを始めた者です。 C言語でWindowsプログラムを書き始めたのですが、最初の宣言を行った時点でコンパイル時に大量のエラーが出てしまいました。 ↓が内容です。 #include<windows.h> #include<stdio.h> #include<stdlib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ } 使用OSはVistaです。 急いではいないので、どなたか解決法を知っている方、ご指導お願いします。

  • AppleScriptでプログラミング

    私は最近C言語のプログラミングに興味を持ち、Mac os 10.3.9に入っていた「AppleScript」の中の「スクリプトエディタ」で、インターネットで見つけた文字列、例えば下の #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ if( DxLib_Init() == -1 ) return -1; WaitKey() ; DxLib_End() ; return 0 ; } などを打ち込んでみたのですが、さっぱりコンパイルできません。 なにしろ初心者なもので、何がなんだかさっぱり分からず困っています

  • VS2010 C++ エラーについて

    Visual Studio2010のC++を使用しているのですが、DLLにメッセージボックスを使用したいと思っています。 .cppに #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance , LPSTR lpCmdLine, int cmdShow) { MessageBox(NULL,"○○○","△△△",MB_OK); return 0; } 上記のようなソースコードを使って見ると、○○○と△△△の部分でエラーを吐きます。 どのようにすれば改善されるか教えてください。

  • Windowsアプリケーションをどうしても作りたいのですが

    /* OS==XP コンパイラー==Borland C++5.5 */ #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { return 0; } で Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) となるのでexeファイルができません。 解決法を是非教えてください。 C言語歴2日+1H

  • EXEでMessageBoxを作る方法

    Microsoft visual c++でメッセージボックスを作りました。 それをEXEの形にしたいのですが、どうすれば良いのでしょうか? 詳しく教えていただけるととても助かります。 ちなみに下記がVisual c++で作ったメッセージボックスのソースです。 #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , TEXT("how are you?") , TEXT("メッセージボックス") , MB_OK); return 0; }

専門家に質問してみよう