WinXP(SP2),Visual Studio 2005,VC++,MFCは未使用
USBフラッシュメモリをPCに挿入した際、中身をモニタに表示させる行程が面倒なので、そこまでの全ての行程を常駐型プログラムにさせてしましたいと考えています。
そこでまず、PC挿入時のイベントを拾いたいと考えています。
それを可能にするAPIが存在しているという事実までは明らかになったものの、具体的にどんなものなのかは現時点では不明です。
ホットプラグ関連なのでしょうが、調べてみてもよくわかりませんでした。
挿入時、自動的にタスクトレイにバルーンが表示されることからも、やはり何らかの方法があるはずです。
何らかの情報をお持ちの方、助けて頂けないでしょうか。
No.1ベストアンサー
- 回答日時:
★アドバイス
・API 関数とは SHChangeNotifyRegister() でしょうか。
使ったことがないので詳しくありませんが、API 関数以外にも WM_DEVICECHANGE メッセージで
検出できるようです。
・次に参考になりそうなリンクを貼って置きます。
http://support.microsoft.com/kb/163503/ja→『CD-ROM 挿入-取り出しの通知を取得する方法』
http://oshiete1.goo.ne.jp/qa1815976.html→『リムーバブルドライブの検出』
※『WM_DEVICECHANGE』キーワードでネット検索すればいろいろと情報が見つかると思います。
・以上。
参考URL:http://search.msdn.microsoft.com/search/Default. …
この回答への補足
さっそくの回答、感謝致します。
>SHChangeNotifyRegister()
さっそく調べてみましたが、資料が少ないですね。
WM_DEVICECHANGEは知りませんでした。
調べてみると、随分な数の関連サイトがありました。
ありがとうございました。
そこで、さっそく簡単なプログラムを書いてみましたが、コンパイルが通りません。
リムーバブルディスクの挿入と取り外しを検知するプログラムです。
>'DBT_DEVICEARRIVAL' : 定義されていない識別子です。
>case 式は、整数型定数でなければなりません。
>'DBT_DEVICEREMOVECOMPLETE' : 定義されていない識別子です。
>case 式は、整数型定数でなければなりません。
>'DBT_DEVNODES_CHANGED' : 定義されていない識別子です。
>case 式は、整数型定数でなければなりません。
このようなエラーが出てしまいます。
他のサイトのリファレンスを参考にしても、ほぼ同じ手法をとっています。
念のため、SDKのdbt.hを確認したところ、
#define DBT_DEVICEARRIVAL 0x8000
と、しっかり定義してあります。
もちろん、以下のコードのDBT_DEVICEARRIVALの部分を0x8000に置き換えるとコンパイルされるし、ちゃんと動作します。
なぜこうなってしまうのでしょうか。
お答え頂けたら幸いです。
#include <windows.h>
#include <dbt.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg){
case WM_COMMAND:
//...
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_DEVICECHANGE: //0x219:
TCHAR str[512];
switch(wParam){
case DBT_DEVICEARRIVAL:
wsprintf(str,TEXT("ドライブが追加もしくはディスクが挿入されました。W=0x%x , L=0x%x"),wParam,lParam);
break;
case DBT_DEVICEREMOVECOMPLETE:
wsprintf(str,TEXT("ドライブが削除もしくはディスクが排出されました。W=0x%x , L=0x%x"),wParam,lParam);
break;
case DBT_DEVNODES_CHANGED:
wsprintf(str,TEXT("ドライブがシステムにより追加or削除されました。W=0x%x , L=0x%x"),wParam,lParam);
break;
default:
wsprintf(str,TEXT("デバイスに変化あり。W=0x%x , L=0x%x"),wParam,lParam);
break;
}
MessageBox(hWnd,str,TEXT("確認"),MB_OK);
return TRUE;
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
//以下はメイン関数部分。
Oh-Orange様。
申し訳ありません。
お礼をするはずが、補足の方に書いてしまいました。
うっかりしてました。
お詫びします。
No.2
- 回答日時:
★アドバイス
・私も簡単なソースでコンパイルしてみましたが問題なくコンパイルできました。
下にそのサンプルを載せておきます。→本当に単純です。
サンプル:
#include <stdio.h>
#include <windows.h>
#include <dbt.h>
// テスト
int main( void )
{
printf( "0x%04X\n", DBT_DEVICEARRIVAL );
printf( "0x%04X\n", DBT_DEVICEREMOVECOMPLETE );
printf( "0x%04X\n", DBT_DEVNODES_CHANGED );
return 0;
}
その他:
・私は VC++.NET 2003 を使っています。
お使いのコンパイラとそのバージョンは何でしょうか?
・windows.h の前に次に1行を挿入してもコンパイルできないかどうか確認して下さい。
#define WINVER (0x501)
↑
windows.h より前に定義すること。
#include <stdio.h>
#include <windows.h>
#include <dbt.h>
・以上。
>#define WINVER (0x501)
コンパイルしてみましたが、やはりだめでした。
コンパイラとバージョンですが、Visual C++ 2005で、バージョンはstandard ということでよろしいでしょうか。
ちなみに、VC++2005のExpress Editionでコンパイルしてみると、当たり前ですがそのまま通りました。
何か環境設定がうまくいってないのかもしれません。
これから調べてみたいと思います。
目的は果たせたので、今回はこれでよしとします。
いろいろとありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
wndProcを用いたUSBデバイスの抜差し検知
C言語・C++・C#
-
リムーバブルドライブの検出
C言語・C++・C#
-
C++でUSBメモリが接続されたことを認識したい
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C#で char型とstring型の比較で...
-
同じEXE・同じファイルで解析結...
-
math.hに含まれる関数が使えない
-
DLLは解読可能ですか
-
[COBOL] ソースの復帰
-
64ビットのlinuxで32ビットメモ...
-
実行後にコンパイルに失敗しま...
-
すべてのリビルド: 0 正常、 0 ...
-
新版 明解C++ 入門編 に...
-
サクラエディタとコンパイラ
-
「インクルードファイル 'pthre...
-
C言語で作ったらWindowsでもMac...
-
NASMとMASMの違い
-
gccを使ってのリンク時のライブ...
-
fatal error LNK1112
-
PIC同士のシリアル通信について
-
cygwinでmakeが見つからない
-
c言語です コンパイルした時に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
すべてのリビルド: 0 正常、 0 ...
-
lhafileをインストールしたい
-
C#で char型とstring型の比較で...
-
gcc コンパイル killed
-
[COBOL] ソースの復帰
-
c言語です コンパイルした時に...
-
実行後にコンパイルに失敗しま...
-
共有ライブラリの内容確認について
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
64ビットのlinuxで32ビットメモ...
-
NASMとMASMの違い
-
C言語で作ったらWindowsでもMac...
-
math.hに含まれる関数が使えない
-
MVSマシンで0C7でABENDしたので...
-
ccとgcc
-
「インクルードファイル 'pthre...
-
自作DLLの中身を暗号化
おすすめ情報