忙しい現代人の腰&肩のお悩み対策!

USBメモリなどをPCに挿した時
ドライブが追加されたことを
自前のプログラム内で
検出する方法は何があるでしょうか?

自分で一定時間ごとに
ドライブ一覧を列挙して知ることはできますが
これは、あまりにも感がしますので
他にスマートな方法があれば教えて頂けないでしょうか

何かヒント的なものでもかまいませんので
よろしくお願いいたします

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Shellから呼び出してもらえばいいでしょう。


SHChangeNotifyRegisterというのがあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
少し調べてみたところ
WM_DEVICECHANGEで捕捉出来ないものも
検出できるようで、使えそうです

お礼日時:2005/12/04 15:35

環境が書いていないのでWindowsだと思って回答します。



USBなどを接続すればWindows内で何かしらのメッセージがやり取りされるはずです。それを調べれば接続時にドライブを検出するようにできるのでは内でしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます
そういえば環境書いてませんでした
Windows XPが対象でした
調べてみたところ
WM_DEVICECHANGEメッセージが使えそうです

お礼日時:2005/12/04 15:34

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QリムーバブルディスクをPCへ挿入を監視したいのです

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

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

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

Aベストアンサー

★アドバイス
・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.aspx?brand=msdn&locale=ja-jp&query=WM_DEVICECHANGE

QwndProcを用いたUSBデバイスの抜差し検知

現在VC++2008のC++/CLIを用いてwindows form アプリケーションを作成しています。
USBカメラの抜挿しを検知しようと思い,http://d.hatena.ne.jp/shiwork/20100126/1264453129のサイトを参考にさせていただき,下記のコードを書きました。

#include <windows.h>
#include <Dbt.h>

virtual void WndProc(System::Windows::Forms::Message% m) override
{

 if(m.Msg == WM_DEVICECHANGE)
 {
   switch((int)(m.WParam))
   {
     case DBT_DEVICEREMOVECOMPLETE:
       MessageBox::Show("out");
       break;
     case DBT_DEVICEARRIVAL:
       MessageBox::Show("in");
       break;
   }
  }
  Form::WndProc(m);
}

このコードをステップ実行してみたところ,USBカメラを抜いても挿しても,m.WParamの値は '7'のままで変わりません。またswitchで一時停止し,F10で1ステップ実行したところ,すぐにswitchを抜けてしまい,条件式を全く評価していないようでした。
どのようにすれば,USBカメラの抜挿しを正常に検知できるでしょうか?

現在VC++2008のC++/CLIを用いてwindows form アプリケーションを作成しています。
USBカメラの抜挿しを検知しようと思い,http://d.hatena.ne.jp/shiwork/20100126/1264453129のサイトを参考にさせていただき,下記のコードを書きました。

#include <windows.h>
#include <Dbt.h>

virtual void WndProc(System::Windows::Forms::Message% m) override
{

 if(m.Msg == WM_DEVICECHANGE)
 {
   switch((int)(m.WParam))
   {
     case DBT_DEVICEREMOVECOMPLETE:
  ...続きを読む

Aベストアンサー

見直したハズですが、アホな誤字があったので訂正。

># 接続したUSB2.0 Cameraのプロパティ、詳細の「デバイカクラスGUID」の値。

「デバイス クラス GUID」です。

QC#で、USBなどに差し込まれたリムーバブルディスクのドライブパスを動的に取得するには

デジカメなどで撮影した写真を一気にPCの作業用フォルダにコピーする
というアプリを作っているのですが、そのときのリムーバブルディスクを
FolderBrowserDialogなどを介さずに、動的に求めたいのですが、
その方法を教えていただけないでしょうか。

手順は…
1,アプリ側で『メディアを挿入してください』などのメッセージが出る。
2,USBにメディアを差し込む
3,動的にドライブパスを取得し、『~からファイルを取得します。よろしいですか?』とメッセージボックスが出る。
4,OKを押すと、コピーが始まる。

…となっております。
3のところを調べております。

宜しくお願いいたします。

Aベストアンサー

最初は
1の前と、2の後でそれぞれ
http://jeanne.wankuma.com/tips/path/getlogicaldrives.html
をやって比較でもするかなあと思ったけど、
それやると、もし、「メディアを挿入してください」の後にボタン幼いならポーリングしなきゃいけないかと思ってさらに調べました。

以下、CodeProjectで配布されているDriveDetector.csというファイルがあってDriveDetectorクラスを用いる手がありそうだな、という気がします
http://www.codeproject.com/cs/system/DriveDetector.asp?df=100&forumid=397899&exp=0&select=1960849

私はメッセージ関係を良く理解してはいないのですが、
ひょっとしたら他のCLI環境への移植には向いてないかもしれません。

QDEVICECHANGE() の受け取り

常駐し、USBメモリなど追加された場合を検出したいです。
どうしたらいいでしょうか?
次のソースでwin32空きプロジェクトを作成します。

#include<windows.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow ) {

return 0;
}


ON_WM_DEVICECHANGE()
というメッセージを受け取るそうですがどうしたらいいでしょうか?
例えば、USBドライブを検出した場合、メッセージを表示するようにしたいです。

Aベストアンサー

#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プログラムは受け身で物を考えないといけません。
このプログラムは×で閉じます。だから「常駐」ではありません。
★のところは別途調べてください。

#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)WndPro...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Qマルチスレッド間でデータ交換をする方法

マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。

Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。

やりたいことは、
スレッドAとスレッドBを生成し、
スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆)

スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか??

まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!

Aベストアンサー

スレッド間でデータ(メモリ空間)は共有されます。

なので,
どのスレッドからも,同じようにデータにアクセスできます。

goopon さんの質問内容は,スレッド間というよりも,クラスのインスタンス間でのデータ交換になると思います。

クラス Y のインスタンス y で生成したデータを,
クラス X のインスタンス x で使いたければ,
例えば,x の生成時に y へのポインタを渡しておいて,それを使って,y のメンバ関数を呼び出したりしますよね?

これは,マルチスレッドでも,シングルスレッドでも同じことです。

ただし,気をつけないといけないのは,
スレッド A から y のメンバ関数を呼び出すと,スレッド A で処理が行われ,
スレッド B から y のメンバ関数を呼び出すと,スレッド B で処理が行われるということです。
つまり,A と B から同時に y のメンバ変数を書き換えたり,
A が読んでいる最中に B が書き込んだりといったことが起こり得ます。
こうなると,データの整合性が取れなくなる恐れがあるので,
スレッド間の同期を取ったり(排他制御をしたり)する必要があります。

スレッド間でデータ(メモリ空間)は共有されます。

なので,
どのスレッドからも,同じようにデータにアクセスできます。

goopon さんの質問内容は,スレッド間というよりも,クラスのインスタンス間でのデータ交換になると思います。

クラス Y のインスタンス y で生成したデータを,
クラス X のインスタンス x で使いたければ,
例えば,x の生成時に y へのポインタを渡しておいて,それを使って,y のメンバ関数を呼び出したりしますよね?

これは,マルチスレッドでも,シングルスレッドで...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QSHGetPathFromIDList によるパス取得

IShellFolder によって、ある LPCITEMIDLIST から SHGetPathFromIDList を利用してパスを取得しようとしているのですが、意図したパス情報が返されないので困っています。

詳細
SHBrowseForFolder で呼び出せるフォルダ選択ダイアログのような フォルダ選択画面を作成しています(諸事情がありフォルダ選択ダイアログが使えません)。
そこで次のサイト

http://hp.vector.co.jp/authors/VA016117/winsdk.html

を参考に、ユーザーが選択したフォルダのパスをSHGetPathFromIDList を呼び出して取得しようとしているのですが、なぜか例えば "D:\test" は "C:\Documents And Setting\user_name\デスクトップ\test" として返されるため、次の段階のディレクトリのオープン処理(FindFirstFile)に失敗してしまいます。

SHBrowseForFolder のようにドライブレターから始まるパスを取得するにはどうすればいいのでしょうか。

IShellFolder によって、ある LPCITEMIDLIST から SHGetPathFromIDList を利用してパスを取得しようとしているのですが、意図したパス情報が返されないので困っています。

詳細
SHBrowseForFolder で呼び出せるフォルダ選択ダイアログのような フォルダ選択画面を作成しています(諸事情がありフォルダ選択ダイアログが使えません)。
そこで次のサイト

http://hp.vector.co.jp/authors/VA016117/winsdk.html

を参考に、ユーザーが選択したフォルダのパスをSHGetPathFromIDList を呼び出して取得しようと...続きを読む

Aベストアンサー

★アドバイス
 SHGetFolderLocation
 SHGetSpecialFolderLocation
 SHGetSpecialFolderPath
 で検索して下さい。
 http://www001.upp.so-net.ne.jp/yamashita/doc/shellfolder.htm
 http://hp.vector.co.jp/authors/VA023539/tips/shell/002.htm

参考URL:http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx


人気Q&Aランキング