デスクトップアプリでWindows Runtime APIをコールする(センサーとか)

前から、デスクトップアプリからWindows Runtime API(の一部)を呼び出せるのは知っていたのですが、最近、本当にコールする必要が生じたので、やり方をここに書いておきます。 ※この投稿はストアアプリより、デスクトップアプリの方が良いです…という話ではありません。使えるWinRT APIは一部だし、セキュリティ、パフォーマンスなどストアアプリで使った方がいいので、なるべくストアアプリを使うことをお勧めします。 Windows Runtime APIを使おうとするのは、Visual Studioで、”Windowsデスクトップ”→”WPFアプリケーション”プロジェクトテンプレートで作ったプロジェクトです。このプロジェクトは本来.NET FrameworkのAPIを使用します。 プロジェクトファイル(C#なら*.csproj)をテキストエディタ等で開きます。 <Project>…</Project>という記述がありますね。その中に<PropertyGroup>…</PropertyGroup>という定義がいっぱいあります。これらに並べて、   <PropertyGroup>    <TargetPlatformVersion>8.0</TargetPlatformVersion>  </PropertyGroup> を入れます。 プロジェクトをVSで再度開きます。 参照設定に、以下のパスに存在する、Windows.winmd というファイルを追加します。 C:\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral ※32ビットOSの場合は、”Program Files\Windows Kits… これで設定は終わり。 例えば、加速度センサーなら、 var accelerometer = Windows.Devices.Sensors.Accelerometer.GetDefault(); と、こんな風に取り出すことができます。但し、イベントを”+=”の様な普通の形式では使うことはできません。  

2

ETロボコン向け計測システム紹介

ETロボコン2011のチャンピオンシップも昨日無事終わり、競技に参加された皆さんが開発されたロボットの走行性能にただ驚くばかりでした。参加された皆さん、お疲れ様!! ETロボコン競技中に図のような絵が、スクリーンに表示されて、競技の状況表示や、走行時間の計測を行っているのを、会場に来た方でしたら見ていることと思います。 このシステムは、このブログの筆者である太田がシステム全般、表示部分は、クラスメソッドの杉浦さん、チーム紹介のアニメーションは東海大学の学生さん(昨年作成)、タイム計測用のスイッチボックスはシステムクリエイトの高橋さんが担当して、開発し、各大会で使っていただいているシステムです。2011年の大会では、北海道、東北、北関東、東京AB、北陸、東海、関西、中四国、九州、沖縄、チャンピオンシップの全12大会、全てで使ってもらうことが出来ました。 折角なので、このシステムの中身を本ブログで紹介します。このシステムは、ETロボコン競技会に関わる様々な作業を自動化しています。機能は以下の通りです。 大会参加チーム情報登録 大会の走行順登録 二つのラウンド、ターン進行の管理 スタートからの経過時間、ゴール時のタイム、走行状況、難所クリア状況の表示 大会ルールに則ったリザルトタイムの計算 走行結果、走行時間、難所クリア状況の蓄積 走行順位計算 モデル審査結果登録 総合順位結果計算 モデル評価・走行結果傾向分析 中間順位表示(昨年版:酒田エス・エー・エスさん協力) 記録間違いを修正する為の裏仕掛け オリンピックのタイム計測と同様、万が一計測アプリが、何らかの原因でハングし、計測データがぶっ飛んでしまったら大変なので、競技結果はRDBに蓄積、競技状況表示と平行して、裏で色々と操作をする為に、コアのサービスはIIS上で動作するWebサービス、表示ソフトその他は、WebサービスをHTTP/SOAPでアクセスするという祖結合にし、それ+幾つかの工夫で拡張性・保守性を挙げています。また多彩でカッコいい表示を短期間で開発する為に、WPFでUIを作っています。使っている技術を列記します。 WPF(Windows Presentation Foundation) WCF(Windows Communication Foundation) SQL Server 2008 R2 EF(Entity Framework) IIS(Internet Information Server) MEF(Managed Extension Framework) Office ToolkitによるExcel拡張 .NET Frameworkを使ってC#によるプログラミング 動作推奨環境は Windows 7 Excel 2010 Visual Studio 2010 上位エディション(無償のExpress Editionでも可) システム構成は図のようになっています。 スイッチボックスハードウェアは、USBでPCに接続され、仮想COMポートでアプリと通信しています。ETロボコンの時間計測精度は0.1秒で、PCでは実時間保障が出来ないので、スイッチボックス内のカウンターで時間を計測し、PC側でその値を元に各種処理を行っています。 計測システム一式、使い方は、http://etrcrts.codeplex.com/ で公開しています。また、このサイトは、オープンソース開発用サイトで、このサイトを使って並行開発、障害管理、構成管理などのプロジェクト管理を行っている状況です。システム開発のボランティア募集中なので、やりたい方、ご連絡ください。IISで動いているWebサービスとRDBの部分のクラウド化なども進めているので、単にWin7アプリの開発だけでなく、Windows Phoneをはじめとするスマートフォン向けのビューワー、計測方法、競技状況記録方法改善などもあるので、是非。 より細かい部分の解説は以降のポストで。チャンピオンシップで行ったクラウド化(Azure)実験もね。


WPF版 BingMap Control(Beta)紹介

久々のWPF関連投稿です。Windows Phone 7に関するブログでもBingMapコントロールをたびたび紹介していますが、Windows 7 Sensor & Locationとの組合せで使えそうなBingMapコントロールのベータが出ていたので紹介します。 http://www.microsoft.com/download/en/details.aspx?id=27165 このリンクからSDKをダウンロード&インストールします。 使う時には、インストール先のディレクトリ(c:\Program Files (x86)\Bing Maps WPF Control)のBeta\Librariesディレクトリに入っているMicrosoft.Maps.MapControl.WPF.dllをプロジェクトの参照で追加します。 そして、XAMLに         xmlns:map=”clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF” と名前空間を定義して、使いたいところで         <map:Map Grid.Row=”2″ Name=”myMap”                  ZoomLevel=”14″                 CredentialsProvider=”CredentialKey”/> と埋め込みます。CredentialKeyは、BingMapのポータルhttps://www.bingmapsportal.com/から取得してください。 コードビハインド側では、例えば             var location = new Microsoft.Maps.MapControl.WPF.Location(latitude, longitude, altitude);            myMap.Center = location; と書けば、地図の中心を更新することが出来ます。 以上、簡単に紹介まで。後ほどまた色々と紹介しますのでお楽しみに。  


XAMLで作る簡単メーターコントロール

いつも、センサー、センサー、云うてますやん。データ計測したら見たいですやん。…という事で、XAMLで作るメーターコントロールを紹介します。 見た目は、こんな感じ。タイトルは変更可能、数字をセットすると針が動くというものです。 XAMLはざっと     <Canvas>         <TextBlock Name=”tbTitle” Text=”Electric Power” FontSize=”20″  HorizontalAlignment=”Center” Height=”32″ Width=”200″ Canvas.Left=”20″ Canvas.Top=”0″ />         <TextBlock Name=”tbValue” Text=”1000000″ FontSize=”20″ Canvas.Top=”38″ Canvas.Left=”75″/>         <TextBlock Name=”tbUnit” Text=”Watt” FontSize=”20″ Canvas.Top=”128″ Canvas.Left=”96″/> <!– 5つのRectangleは、目盛 –>        <Rectangle Width=”20″ Height=”4″ >             <Rectangle.Fill>                 <SolidColorBrush Color=”Red”/>             </Rectangle.Fill>             <Rectangle.RenderTransform>                 <TranslateTransform X=”10″ Y=”178″/>             </Rectangle.RenderTransform>         </Rectangle>         <Rectangle Width=”20″ Height=”4″ >             <Rectangle.Fill>                 <SolidColorBrush Color=”Red”/>             </Rectangle.Fill>             <Rectangle.RenderTransform>                 <TransformGroup>                     <TranslateTransform X=”10″ Y=”178″/>                     <RotateTransform CenterX=”120″ CenterY=”180″ Angle=”45″/>                 </TransformGroup>             </Rectangle.RenderTransform>         </Rectangle>         <Rectangle Width=”20″ Height=”4″ >             <Rectangle.Fill>                 <SolidColorBrush Color=”Red”/>             </Rectangle.Fill>             <Rectangle.RenderTransform>                 <TransformGroup>                     <TranslateTransform X=”10″ Y=”178″/>                     <RotateTransform CenterX=”120″ CenterY=”180″ Angle=”90″/>                 </TransformGroup>             </Rectangle.RenderTransform>         </Rectangle>         <Rectangle Width=”20″ Height=”4″ >             <Rectangle.Fill>                 <SolidColorBrush Color=”Red”/>             </Rectangle.Fill>             <Rectangle.RenderTransform>                 <TransformGroup>                     <TranslateTransform X=”10″ Y=”178″/>                     <RotateTransform CenterX=”120″ CenterY=”180″ Angle=”135″/>                 </TransformGroup>             </Rectangle.RenderTransform>         </Rectangle>         <Rectangle Width=”20″ Height=”4″ >             <Rectangle.Fill>                 <SolidColorBrush Color=”Red”/>             </Rectangle.Fill>…


WPFでBingMapsを使う

この間書いたポストの中に出てきたBingMapをWPFアプリケーションで使う方法を紹介します。ブラウザアプリで使う場合、迷わずMaps Silverlight Controlを使ってくださいね(このネタは誰か別のエバが書いているのでそちらを参照してね)。 さて、ここでは、WPFアプリケーションにBingMapsを埋め込む簡単な方法を紹介します。現在のところWindows Sensor APIは、COMのWrapperを噛まさないと、Silverlightからはアクセスできないので、BingMapsをセンサーでコントロールしたい、といったような場合は、こちらが便利。 まずは、WPFアプリケーションプロジェクトを一つ作成し、WebBrowserコントロールをツールボックスからドラッグ&ドロップして貼り付けます。 <Window x:Class=”WpfApplLocation.MainWindow”        xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”        xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”        Title=”MainWindow” Height=”600″ Width=”820″>    <StackPanel Orientation=”Vertical”>        <WebBrowser Name=”webBrowser1″ MinHeight=”500″ />    </StackPanel></Window> WebBrowserコントロールの、SourceプロパティにURLを設定すると、そのURLの内容が表示されます。例えばTextBoxをXAML上に配置して、そのTextBoxの文字列と、Sourceプロパティを連結すると、簡単なブラウザをWeb上で構築することも可能です。 ここでは、以下のようなHTMLファイルをプロジェクトに追加します。名前は、BingMapCtrl.htmとしておきます。 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><html>   <head>      <title></title>      <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>      <script type=”text/javascript”     src=”


Windows 7脳波センサービデオの舞台裏

ちょっと前に、公開された、http://msdn.microsoft.com/ja-jp/windows/ff423757.aspxですが、この舞台裏が、MSNに載っちゃいました。http://windows7.jp.msn.com/journal/jo07-01.htm (照れる)


Windows 7 Sensor & Locationを使ってみよう Series !!

今までブログにポストしてきた関連項目の目次です。 Windows Mobile 7 Seriesの発表にあやかり、最後にSeriesをつけてみました。(でへ) では早速過去のポストへのリンクを、まとめて一挙公開です。 「Windows 7 Sensor & Locationを使ってみよう!!」シリーズ http://blogs.msdn.com/hirosho/archive/2009/11/22/windows-7-sensor-location-platform-1.aspx先ずは準備を兼ねて肩慣らしの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/26/windows-7-sensor-location-platform-2.aspxManaged Code(Windows API CodepackのSensor)で、センサーを取り出すの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/28/windows-7-sensor-location-platform-3.aspxManaged Code(Windows API CodepackのSensor)で、センサーからデータを取り出すの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/29/windows-7-sensor-location-platform-4.aspx.NET 4のSystem.Device.Locationでロケーションをいぢるの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/12/08/windows-7-sensor-location-platform-5.aspxNative CodeでSensor COM APIごりごり開発、VC++ Native Codeが書けるなんてかっこ良~いの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/12/22/windows-7-sensor-location-platform-6.aspx.NET 4 WPF Chartを使って、取り出したデータを見える化だぁ、の巻ぃ http://blogs.msdn.com/hirosho/archive/2010/02/05/windows-7-api-codepack.aspxサイドスト~リー(番外編):Windows API Codepackに新たな秘密兵器を装着しようぜっ、の巻ぃ http://blogs.msdn.com/hirosho/archive/2010/03/10/neurosky-mindset-windows-7-sensor-api.aspxサイドスト~リー(番外編):Mindsetで頭の中を覗いてみようっ、の巻ぃ 新しくネタが出たら、順次追加の予定なので、偶にチェックしてねっ!!


Windows 7 Sensor & Location Platformを使ってみよう – その6

あーっと言う間に年末ですね。気温も随分下がって、寒い毎日が続いていますねっ。私はノースブルー生まれ(嘘です。単なる北国生まれです)のわりに、寒さに弱いので往生してますが、気温と言えば、小学校の夏休みの宿題で、課題研究というのがあって、ある年、何もネタが思い付かず、夏休み中の温度を2学期の始業式直前に新聞をひっくり返しつつ、片っぱしから書き出して、グラフと、お天気マークを入れていったことが思い出されます。あんときゃぁ、しんどかったぜぃ…って、もうかなり昔のことなので良くは覚えていないんですけどぅ。 前置きが長くなりましたが、Windows 7のSensor APIで温度を計測したとき、それをグラフにしたくなりますね。というわけで、今回は取得したデータを表示する方法として、WPFのChartコントロールを紹介します。 このコントロール、Visual Studio 2008 SP1(.NET Framework V3.5 SP1)までは、WPF Toolkitとして公開されていました。Visual Studio 2010(.NET Framework V4.0)からは、標準の部品として加わったようです。WPFのツールボックスに“Data Visualization”というカテゴリーがあって、そこに、Chartという名前でリストに入っています。XAMLのデザイナーで、ツールボックスからドラッグ&ドロップすればすぐ使えます。 このChartコントロール、棒グラフや折れ線グラフ、円グラフ、等々、かなりいろんなグラフの種類がサポートされていて、で、もちろん、Data Bindingも出来るし、凡例やラベルをStyleで指定できるので、見栄えの良いグラフを簡単に、そして、動的に描画することができる、優れモノです。多分、一般的に、データを収集、テキストファイルとして保存、Excelに読み込み、グラフ作成、・・・みたいな流れをやっちゃう人がたくさんいる?、もしくはOpenGL等を使ってゴリゴリ書くのが、理系の技術者の発想のような気がしますが、そんな手間は一切要りません。Silverlihgtでももちろん使えます。この忙しい年の瀬、やりたいことがパッとできるって、ありがたいよね。 上の図は、ツールボックスからドラッグ&ドロップして、そのあと、以下のように成形した状態。(Visual Studio 2010を利用) <Window x:Class=”…”        xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”        xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”        Title=”Graph” Height=”400″ Width=”600″        xmlns:chartingToolkit=            “clr-namespace:System.Windows.Controls.DataVisualization.Charting;            assembly=System.Windows.Controls.DataVisualization.Toolkit”>    <Window.Resources>        <Style x:Key=”DateTimeAxisLabelStyle1″            TargetType=”{x:Type chartingToolkit:DateTimeAxisLabel}”>            <Setter Property=”StringFormat”                 Value=”{}{0:yyyy/MM/dd HH:mm:ss}”/>            <Setter Property=”RenderTransform”>               ※ ここ何やってるかというとグラフの目盛の値が               ※ 表示の際重ならないように、位置ずらし、斜め化してる                <Setter.Value>                                      <TransformGroup>                        <ScaleTransform/>                        <SkewTransform/>                        <RotateTransform Angle=”315″/>                        <TranslateTransform Y=”70″/>                    </TransformGroup>               …