いつもお世話になっております。
ブヒブヒです。
開発環境
WindowsXP Pro SP3
Visual Studio 2005 MFC
使用環境
Windows2000 Pro SP4
Windows2000でUSBメモリ等のUSBデバイスを「取り外し操作」を
行わずに取り外したときに表示される、
「デバイスの取り外しの警告」ウィンドウを消す機能を
USBデバイスを操作するツールに搭載しなければならなくなりました。
そこで
デバイスが変更されたときに出るWM_DEVICECHANGEを
受け取り、そこでウィンドウを消す処理をすれば
よいと考え、下記の通りにしたのですがウィンドウが消えませんでした。
LRESULT CXXXDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
// 「デバイスの取り外しの警告」ウィンドウハンドルを取得する
HWND hWnd = NULL;
hWnd = ::FindWindow( NULL, _T(デバイスの取り外しの警告) );
if( hWnd == NULL )
{
return 0;
}
::DestroyWindow( hWnd );
return 0;
}
WM_DEVICECHANGEでここに来ることは確認しているのですが
どのようにすればウィンドウを消せるのかわかりません。
大変申し訳ありませんが
「デバイスの取り外しの警告」ウィンドウを
消す方法を教えていただけないでしょうか。
よろしくお願いいたします。
ブヒブヒ
デバイスドライバーの修正が必要みたいですね。
http://support.microsoft.com/kb/298504/ja
へたに抜くと問題みたいですね。
ハードウエア技術関係者に相談してみたらどうでしょうか?
http://office-isshin.co.jp/cgi-bin/view/indication.cgi?user=hardware&itn=3
これは関係ないですか
http://support.microsoft.com/kb/827675/ja
ITOさん
お返事ありがとうございます。
>デバイスドライバーの修正が必要みたいですね。
> http://support.microsoft.com/kb/298504/ja
上記のところをどのように実装するかを
詳しく教えていただけないでしょうか。
USBデバイスに電源OFF信号をPCからデバイスに送り、
デバイスの電源を切るために取り外し警告が出ます。
クラッシュなどのリスクは予備PCが用意されているので
問題ありません。
よろしくお願いいたします。
ブヒブヒ
> クラッシュなどのリスクは予備PCが用意されているので
> 問題ありません。
PCだけでなくUSBデバイス側にも関係してきます。
> 上記のところをどのように実装するかを
> 詳しく教えていただけないでしょうか。
USBのデバイスドライバーは依存のものを使うか、改めて開発するかに
よって変わります。
依存のものだとするとフィルタドライバーというのを作らないといけない
と思います。
改めて開発するのならば、開発担当者に相談するのがいいと思います。
フィルタドライバーを作るには専門の知識とDDK等の開発ソフトが必要になります。
> 上記のところをどのように実装するかを
> 詳しく教えていただけないでしょうか。
掲示板で説明してどうにかできるレベルを超えているような気がします。
デバイスドライバ系の開発をするのであれば、それなりに開発方法について
勉強する必要があると思いますよ。
ドライバー関係の開発となると実装が拙ければ、
ブルースクリーンなんて事も珍しくないでしょうし。
ドライバー開発してるなんて最初の発言に一言もなかったと思うが・・・
ドライバー開発してるの?してないの?
その USB デバイスとやらは自作なの? Windows 標準デバイスなの?
どこかのメーカーが作っているコピープロテクト系ドングルなの?
俺の記憶によれば surprise removal に正式対応したのは XP 以後なので
W2K で [抜き差し指定せずに] USB デバイスを抜くとエラー画面が出る。
で、今回の要望はそのエラー画面を自動で消したいだけだと読んだが・・・
任意の USB デバイスに対応しなきゃならんのか
USB メモリ (USB Mass-Storage) にだけ対応すりゃいいのか
マシンが壊れてもいいのか
デバイスが壊れてもいいのか
デバイス上のデータが壊れてもいいのか
ってあたりの案件がはっきりしないのにアドバイスも蜂の頭もないもんだ。
予備機があるから壊れてもいいって話には賛成できない。
その辺すべてさておき、最初のコードで FindWindow は成功するの?
成功しているのであればいきなり Destroy せずに WM_CLOSE して味噌。
タイマーで少し遅延する必要があるかもしれない。
これ以上の話は俺としてはパス。
皆様
お返事ありがとうございます。
tetrapodさんのWM_CLOSEで警告を閉じることができました。
LRESULT CXXXDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
// 「デバイスの取り外しの警告」ウィンドウハンドルを取得する
CWnd* pWnd = NULL;
pWnd = FindWindow( NULL, _T(デバイスの取り外しの警告));
if( pWnd == NULL )
{
return 0;
}
pWnd->PostMessage(WM_CLOSE, 0, 0);
return 0;
}
私が良くわからずに質問してしまったため、
大事になってしまい、申し訳ありません。
最初のITOさんのお返事で、
>デバイスドライバーの修正が必要みたいですね。
> http://support.microsoft.com/kb/298504/ja
上記の部分をExeに実装すれば警告が表示されなくなるのだと
安易に考えておりました。
表示された警告を消すよりも
はじめから表示されないほうがいいよな~と思ったもので。
いろいろと勉強になりました。
本当にありがとうございました。
ヘッポコプログラマ@ブヒブヒ
PS
詳細は伏せますが、今回作成しているのは
ある国で大量生産している機器の検品ツールです。
ドライバなどは別の部署が作成したものを使用しています。
仕様書にPC側からデバイスの電源を切ることとなっており、
私の意見は聞いてもらえません。
すいません。
解決にチェックを入れるのを忘れました。
ブヒブヒ
> 仕様書にPC側からデバイスの電源を切ることとなっており、
> 私の意見は聞いてもらえません。
USBドライバーも開発しているのなら、
1.PCからUSBで「停止コマンド」(仮)を出力する。
2 デバイス側は終了処理をしてUSB通信を停止する。
3 抜いていいということをLEDの点灯なりで示す。
4.ユーザーはそれを見てUSBを取り外す。
とする。
デバイス側でUSB通信を停止しているので警告は表示されないはずです。
もし、警告が表示されたのならばそれはユーザーの操作が悪いことになります。
>ドライバなどは別の部署が作成したものを使用しています。
もしそうならできるだけハードで対処したほうがいいです。
ITOさん
ありがとうございます。
試してみます。
ブヒブヒ