アクセスできるデバイスを取得するには

デバイスを列挙する方法 DeviceInformationクラスのFindAllAsyncメソッドによってデバイスに登録されているすべての周辺機器を列挙することができます。 DeviceInformationCollection collection= await DeviceInformation.FindAllAsync(); foreach (DeviceInformation info in collection) { listBoxDevices.Items.Add(string.Format(“Name={0} IsEnabled={1} Id={2}”,info.Name, info.IsEnabled, info.Id)); } DeviceInformationは名前や使用可能かどうか、Idなどを取得することができます。   FindAllAsyncメソッドは高度なクエリ構文によってフィルタリングも可能です。 string selector = “System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True”; DeviceInformationCollection collection= await DeviceInformation.FindAllAsync(selector); foreach (DeviceInformation info in collection) { listBoxDevices.Items.Add(string.Format(“Name={0} IsEnabled={1} Id={2}”,info.Name, info.IsEnabled, info.Id)); }   クエリ構文は書くのが難しいので通常はデバイスに対応したAPIのGetSelectorメソッドによってそのデバイスを特定するクエリ文字列を取得できるのでそれを使用します。 USBデバイスを列挙する場合 string selector=UsbDevice.GetDeviceSelector(0x2341,0x0043); var deviceInfoList=await DeviceInformation.FindAllAsync(selector);   スキャナなどのDeviceClass列挙体で提供されるデバイスはDeviceClass列挙体を渡すことでフィルタリングすることもできます。 DeviceInformationCollection collection= await DeviceInformation.FindAllAsync(DeviceClass.ImageScanner);…

アプリケーションのライフサイクル

WindowsRuntimeのライフサイクル WindowsストアアプリやWindowsPhoneアプリなどは、 終了状態(NotRunning) 実行状態(Running) 一時停止状態(Suspend) の3つの状態を持ちます。   さらに3つの状態では、以下の図のような方法で状態遷移をプログラムで処理できます。 注意点としては、Running→NotRunningと、Suspend→NotRunningでは通知が発生しません。     NotRunning→Running 終了状態から実行状態になるには、ユーザーがアプリケーションのライブタイルをタップしたり、共有ターゲットとして呼び出したりなど、アプリケーションの起動と同義になります。 アプリケーションの起動に関してはアプリケーションの起動プロセスを参照してください。   Running→Suspend アプリがフォアグラウンドにいる状態から、アプリを別のアプリに切り替えてから、時間が立ってメモリが少なくなると、OSがアプリを中断状態(Suspend)にします。 また、OSがロック画面に入ったり、シャットダウンされたりユーザーがサインアウトしたりなどしたとき、中断状態から終了状態にすぐになるのでSuspend状態を経由します。   中断状態に遷移するときにはSuspendingイベントが発生するのでAppクラスから検知できます。 public App() { this.InitializeComponent(); this.Suspending += this.OnSuspending; } private void OnSuspending(object sender, SuspendingEventArgs e) { }   Suspend→Running アプリが一時停止状態にいるときに、ユーザーがアプリをフォアグラウドにだすなどしたとき、アプリを再開します。 これをResumeと呼び、Resumingイベントが発生するのでAppクラスから検知することができます。 public App() { this.InitializeComponent(); this.Resuming += this.OnResuming; } private void OnResuming(object sender,object obj) { }…

アプリケーションの起動プロセス

WindowsRuntimeの起動プロセス WindowsストアアプリやWindowsPhoneアプリなどは、ライブタイルをタップすることで起動したり、共有ターゲットとして起動したりなど、様々な起動方法があります。   WindowsRuntimeにおけるアプリの起動は「アクティブ化」と呼ばれます。 WindowsRuntimeのアプリの起動は以下のフローチャートによって表すことができます。 実行中か判断 アクティブ化されるときは、まずシステムはアプリが実行中かどうかを判断します。 「アプリが実行中でかつアクティブ化されるとき」というのはイメージしにくいですが、例えばフォアグラウンドで実行しているアプリを、別のアプリに切り替え、別のアプリから先ほどのアプリを共有ターゲットとして呼び出した場合などです。 この場合、最初のアプリはバックグラウンドにまわっただけでまだ実行中なのに別のアプリから共有ターゲットとしてアクティブ化されるので「実行中かつアクティブ化」ということになります。 WindowsRuntimeのアプリのインスタンスは常に1つであり、実行中のアプリとそのアプリが別のアプリから呼び出される共有ターゲットは同一のインスタンスとなります。 ApplicationクラスとAppクラス もし実行中でないならば、Mainメソッドが呼び出され、ApplicationクラスのStartメソッドが呼び出されます。 WindowsRuntimeのアプリでは、ビルドされたときにApp.g.i.csファイルが作成され、その中にMainメソッドがあります。 Mainメソッド内ではApplicationクラスのStartメソッドでAppクラスを初期化します。 //App.g.i.csファイル(ビルド時に自動生成) pubic static class Program{ static void Main(String[] args){ Windows.UI.Xaml.Application.Start((p)=>new App()); } } Appクラスのインスタンスは、staticクラスであるApplicationクラスのprivateメンバとして保持されます。 staticクラスであるApplicationクラスによってAppクラスが保持されるため、Appクラスはガベージコレクションによって回収されることはありません。   OnWindowCreatedメソッド その後、OnWindowCreatedメソッドが呼び出されます。 OnWindowCreatedメソッドはApplicationクラスに存在し、Applicationクラスを継承するAppクラスによってoverrideすることができます。 //Applicationクラスのoverride(Appクラスに書く) protected override void OnWindowCreated(WindowCreatedEventArgs args) { base.OnWindowCreated(args); } メインビューアクティブ化とホステッドビューアクティブ化 続いてシステムはメインビューアクティブ化かホステッドビューアクティブ化かどうか判断します。 メインビューアクティブ化とは、ユーザーがタイルをタップしてアプリを起動したり、ユーザーがファイルをタップしたときにアプリが起動したときなどのことを指します。 それに対しホステッドビューアクティブ化とは別のアプリが共有チャームから共有コントラクトを呼び出してアプリがアクティブ化されたときや別のアプリからファイルピッカーによってアプリがアクティブ化されたときなど、 別のアプリによってアクティブ化された場合はホステッドビューアクティブ化と呼びます。 現在のアプリがメインビューアクティブ化か、ホステッドビューアクティブ化かを調べるには、CoreApplicationViewのIsHostedプロパティを見ればわかります。 メインビューアクティブ化ならFalseでホステッドビューアクティブ化ではTrueになります。 CoreApplication.GetCurrentView().IsHosted アクティブ化を2つに分類するとメインビューアクティブ化とホステッドビューアクティブ化になりますが、もっと細かくアクティブ化を分類すると以下の起動方法があります。 種類 説明 アクティブ化の種類 Launch…

IBufferとbyteを相互変換するには

IBuffer WindowsRuntimeでストリームの読み書きをするときはIBufferインターフェースを実装したクラスへとデータを変換する必要があります。 WindowsRuntimeBufferExtensionsクラスの拡張メソッドを使用する 下にDataWriterとDataReaderによる方法を書いてますがもっと簡単な拡張メソッドが System.Runtime.InteropServices.WindowsRuntime 名前空間にありました。   AsBufferメソッドで変換できます string data=”abcd”; byte[] bytes = Encoding.GetEncoding(“ASCII”).GetBytes(data); IBuffer buffer = bytes.AsBuffer();     byte→IBuffer byteからIBufferに変換するにはDataWriterを使います。 usingでDataWriterのDisposeをします。 byte[] writeBytes=//何かしらのデータ IBuffer buffer=null; using (DataWriter writer = new DataWriter()) { writer.WriteBytes(writeBytes); buffer = writer.DetachBuffer(); }   IBuffer→byte IBufferからbyteに変換するにはDataReaderを使います。 IBuffer buffer=//なにかしらのIBufferデータ byte[] readBytes = new byte[buffer.Length]; using (DataReader reader = DataReader.FromBuffer(buffer)) {…

文字列をエンコード、デコードするには

エンコードとデコード 文字列をエンコードするということは、string→byte[]に変換するということです。 逆にデコードするにはbyte[]→stringに逆変換するということです。   文字列は指定の文字コードによってエンコード、デコードされます。 文字コードの種類としては ASCII – 英数字のみ(1文字は常に1byte) UTF-8 – 日本語や中国語など幅広い範囲の文字を表すことができるユニコードの1種類 Shift-JIS – Microsoftが提唱している日本語も表すことができる文字コード。Windowsなどで主に使用される。   エンコード では実際にエンコードしてみます。 エンコードを行うには、System.TextのEncodingクラスから文字コードを指定し、Encodingクラスのインスタンスを取得します。   その後、GetBytesメソッドによってbyte配列にエンコードします。 string str=”こんにちは”; byte[] resultBytes=Encoding.GetEncoding(“Shift-JIS”).GetBytes(str.ToCharArray()); 出力してみます。 Debug.WriteLine(“——–エンコード結果—————“); foreach (byte b in resultBytes) { Debug.WriteLine(b); } byte配列にエンコードすることができました。   デコード ではエンコードしたデータが正しくエンコードできているか、デコードしてみます。 デコードはエンコードしたときと同じ文字コードでEncodingクラスを取得し、GetStringメソッドを呼びます。 string decodeStr = Encoding.GetEncoding(“Shift-JIS”).GetString(resultBytes,0,resultBytes.Length); 出力してみます。 Debug.WriteLine(“———-デコード結果—————-“); Debug.WriteLine(decodeStr); 正しくデコードができました。     UTF-8文字コードを使う場合はこのようにします。 byte[] resultBytes=Encoding.UTF8.GetBytes(str.ToCharArray());   文字化けを起こしてみる…