影のプログラム指南役から、折角知恵をいただいているのだからと、Mass Storageモードから他に切り替えたときに出てくる「画像カードがさされたよ」というダイアログを抹殺する方法にトライしてみました。
要するに、Windowsが吐き出してくるメッセージを捕まえて、AutoPlayだったら、みなかったことにしてしまうというやり方です。
とりあえず、そういうコードを実装してみましたが、肝心のメッセージが流れてきてくれません。デバッガで、捕まえようとしてみたのですが、オーバライドされたWndProc()へ飛び込んできたのは、アプリを終了しようとしている時、しかも、狙ったメッセージではないものでした。トホホ。
using Microsoft.WindowsCE.Forms;
...
internal class MsgWindowCancelAutoPlay : MessageWindow
{
[DllImport("coredll.dll")]
public static extern UInt32 RegisterWindowMessage(string lpString);
private UInt32 WM_QUERYCANCELAUTOPLAY =
RegisterWindowMessage("QueryCancelAutoPlay");
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_QUERYCANCELAUTOPLAY)
{
m.Result = (IntPtr)1; // キャンセル
return;
}
base.WndProc(ref m);
}
}
...
まだ、何かやり方が悪いに違いないが……。あと、このコードを追加すると10KBくらいフットプリントが大きくなるんですよね……。これも何とかしないとなぁ。
...
internal class MsgWindowCancelAutoPlay : MessageWindow
{
[DllImport("coredll.dll")]
public static extern UInt32 RegisterWindowMessage(string lpString);
private UInt32 WM_QUERYCANCELAUTOPLAY =
RegisterWindowMessage("QueryCancelAutoPlay");
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_QUERYCANCELAUTOPLAY)
{
m.Result = (IntPtr)1; // キャンセル
return;
}
base.WndProc(ref m);
}
}
...
シェクまく
残念ですね〜。
そういう理由がわからない挙動をするから好きじゃないわけですが、以前(me使ってた頃)に比べたら最近は怒る事も少なくなってきました。はい。
hiro
まぁ、CEのソースでも調べれば何かわかるのかもしれませんが……。
.NET Compactは.NETに似ているけれど別なものというのがまた、微妙に話をややこしくしてくれています oTL
ヨシヲ
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/autorun/autoplay_reg.asp
Windows CE では使えない方法なのではないでしょうか。
hiro
ヨシヲさん、情報ありがとうございます。
ああっ、やっぱりそうなんですかねぇ...。
まぁ、別にダイアログが出たって、致命的ってこともないので、構わないっていえば、そうなんですけどね。
このあたりの、WindowsとCEとの、微妙な非互換性って情報が散在していて、みつけにくくて、ぃゃですね oTL
ところで、ヨシヲさんって、あのW-ZERO3 Monitorのヨシヲさんですか!?