メインメニューを開く

差分

Xamarin.Macでリムーバブルメディアの着脱を検知する

96 バイト除去, 2018年12月28日 (金) 03:50
MonoMacで[[Xamarin.Mac]]で[[CD-ROM]]や[[DVD-ROM]]、[[USBメモリ]]の挿入などを検出できると何かと嬉しい。
==実装例==
NSWorkspace.SharedWorkspace.NotificationCenterを使うと検出できるようだ。この通知で情報として飛んでくるのはデバイスのパスのみなので、そのパスをNSWorkspaceNotificationCenterを使うと検出できるようだ。この通知で飛んでくるのは「変化のあったデバイスのパスのみ」なので、そのパスをNSWorkspace.SharedWorkspace.GetFileSystemInfoを使いGetFileSystemInfoに投げて「[[CD-ROM]]なのかなのか」「[[USBメモリ]]なのかなどを判別する。なお、CDなのか」などを判別する。なお、GetFileSystemInfoの結果は[[CD-ROMやDVDROM]]や[[DVD-ROMの場合はディスクフォーマットごとに返ってくる値が違うようだ。どんな種類があるのか全部はまだ把握していない。ROM]]の場合はディスクフォーマットごとに返ってくる値が違うようだ。どんな種類があるのか全部はまだ把握していない。
通知には種類があるようで、この例では以下を実装している。
 * NSWorkspaceDidMountNotification - マウント直後* NSWorkspaceWillUnmountNotification - アンマウント直前 
NSWorkspaceDidUnmountNotification(WillではなくDid)も実装すればアンマウント直前のみならずアンマウント直後も検出できる。ただしアンマウント後なのでデバイスパスしか取得できない。アンマウント失敗時を考慮するとこちらの方が確実かもしれないが詳しくは知らない。
 
なお、いわゆる自動実行(autorun.inf)などとは違うので起動していないアプリが起動するわけではない。あくまでアプリが立ち上がっている状態でのみ機能する。
<source lang="csharp">
using System;
using MonoMac.Foundation; using MonoMac.AppKit;
public class RemovableMediaNotificationEventArgs : EventArgs
if (_mountObserver == null)
{
  _mountObserver = notification.AddObserver("NSWorkspaceDidMountNotification"NSWorkspace.DidMountNotification, DidMount);
}
if (_unmountObserver == null)
{
  _unmountObserver = notification.AddObserver("NSWorkspaceWillUnmountNotification"NSWorkspace.WillUnmountNotification, WiilUnmount);
}
}
var workspace = NSWorkspace.SharedWorkspace;
workspace.GetFileSystemInfo(devicePath, out isRemovable, out isWritable,out isUnmountable, out description, out fileSystemType);
var args = new RemovableMediaNotificationEventArgs {
DevicePath = devicePath,
IsRemovable = isRemovable,
==関連項目==
*[[Xamarin.Mac/CDやDVDなどの光学メディアを排出するMacでCDやDVDなどの光学メディアを排出する]] ==参考文献=={{reflist}} {{stub}}* [[Xamarin.Macで接続されているリムーバブルメディアの一覧を取得する]]
[[category:MonoMac]]
[[category:Xamarin.Mac]]
匿名利用者