アプリ版:「スタンプのみでお礼する」機能のリリースについて

WinXP(SP2),Visual Studio 2005,VC++,MFCは未使用

USBフラッシュメモリをPCに挿入した際、中身をモニタに表示させる行程が面倒なので、そこまでの全ての行程を常駐型プログラムにさせてしましたいと考えています。

そこでまず、PC挿入時のイベントを拾いたいと考えています。
それを可能にするAPIが存在しているという事実までは明らかになったものの、具体的にどんなものなのかは現時点では不明です。
ホットプラグ関連なのでしょうが、調べてみてもよくわかりませんでした。
挿入時、自動的にタスクトレイにバルーンが表示されることからも、やはり何らかの方法があるはずです。
何らかの情報をお持ちの方、助けて頂けないでしょうか。

A 回答 (2件)

★アドバイス


・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;
}
//以下はメイン関数部分。

補足日時:2007/06/24 21:08
    • good
    • 0
この回答へのお礼

Oh-Orange様。

申し訳ありません。
お礼をするはずが、補足の方に書いてしまいました。
うっかりしてました。
お詫びします。

お礼日時:2007/06/24 21:15

★アドバイス


・私も簡単なソースでコンパイルしてみましたが問題なくコンパイルできました。
 下にそのサンプルを載せておきます。→本当に単純です。

サンプル:
#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>
・以上。
    • good
    • 0
この回答へのお礼

>#define WINVER (0x501)
コンパイルしてみましたが、やはりだめでした。

コンパイラとバージョンですが、Visual C++ 2005で、バージョンはstandard ということでよろしいでしょうか。

ちなみに、VC++2005のExpress Editionでコンパイルしてみると、当たり前ですがそのまま通りました。
何か環境設定がうまくいってないのかもしれません。
これから調べてみたいと思います。
目的は果たせたので、今回はこれでよしとします。
いろいろとありがとうございました。

お礼日時:2007/06/25 22:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!