Win32 API を 手なずけよう ! 2015.12.12 名古屋 KOUJI MATSUI

Slides:



Advertisements
Similar presentations
© 2007 Autodesk1 ProjectPoint API 概要 AEC ソリューション CPM オートデスク株式会社.
Advertisements

主専攻実験 第1回 ガイダンス資料 TA : 野坂 龍佑 (M2), 高林大輔 (M1)
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
Bluetooth で Go! Bar Windows 8 in 名古屋 with 8.1 けきょ( Kouji )
ソフトウェア工学 理工学部 情報システム工学科 新田直也. 演習問題 1 の解答例  入庫処理の DFD 酒屋の在庫問題の DFD( 入庫処理 ) 更新情報 在庫ファイル 更新処理 倉庫係 在庫不足リスト 在庫ファイル 出庫指示書 新規出庫 判定 出庫指示書 作成処理 出庫依頼 積荷票.
Visual Studio 2010 の新機能 Coded UI Test
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
(実はアイコンは単なる飾りで、この縦書きの部分のどこをクリックしても次のページに移動します。)
Flash 書き換え PHP extension “SWF Editor”
Webサービスに関する基本用語 Masatoshi Ohishi / NAOJ & Sokendai
技術トピックス 2014/10.
HTML 5の表現力 楽しいアプリ制作の会 TWorks 蜜葉.
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
Biac /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
EGSに対応した粒子軌跡と 計算体系の3次元表示ソフト - CGVIEW -
バージョン管理超入門 まだファイルコピーしてます?
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
Flash 書き換え PHP extension “SWF Editor”
RAD Studio 14/09/27 TEffectを使った綺麗なForm
さとりすと Satori Ghost Editor 里々ゴーストの統合開発環境を作ったよ page: 1/25
MSBuild 色々出来るよ 2011/04/02 お だ.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
アプリケーション共有機能 〈参考〉 (図1) (図2)
初年次セミナー 第2回 文字の出力.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
情報学部 プログラミング体験教室 (中級編)
パソコン同好会のホームページは今回WordPressに変わったのですが 使いづらいとの声が多いので投稿者用の手順書を作ってみました。
インタラクティブ・ゲーム制作 <プログラミングコース>
第四回 ゲーム                 05A1054         前田嵩公.
迷宮師 コードレビュー チームカテキン.
第2回 Microsoft Visual Studio C++ を使ってみよう
Biac /10/ /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
C言語を用いたシューティング ゲームの作成
9.1 DOMの概要 9.2 DOMプログラミングの基礎 9.3 DOMのプログラミング例
Leap Motionを用いた実世界指向 アプリランチャの設計と開発
Windows Azure (CTP) 触ってみた
暗黙的に型付けされる構造体の Java言語への導入
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
プログラミング 4 記憶の割り付け.
.NET Framework 3.0 概要 (旧称 : WinFX)
10.構造体とグラフィックス.
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
0.2 プロジェクトの準備 DXライブラリを使うための準備.
EGSに対応した粒子軌跡と 計算体系の3次元表示ソフト - CGVIEW -
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
Windows Azure (CTP) 触ってみた
プロジェクト演習Ⅱ インタラクティブゲーム制作
Java における 先進的リフレクション技術
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
NGK2013B – 名古屋合同懇親会 2013忘年会 – Kouji
C言語 はじめに 2016年 吉田研究室.
第1章 いよいよプログラミング!! ~文章の表示 printf~
オブジェクト指向プログラミング クラス 継承
手書き文字の自動認識アプリケーション 15K1013 坂本 倖輝
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
某有名落ちものゲーム っぽいものを作ってみる
某有名落ちものゲーム っぽいものを作ってみる
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
専門ゼミ最終発表会ガイダンス 平成26年1月8日 森田 彦.
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
ソフトウェア工学 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
3.1 シューティングゲームの当たり判定 当たったら死亡.
プロジェクト演習Ⅱ インタラクティブゲーム制作
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
Presentation transcript:

Win32 API を 手なずけよう ! 名古屋 KOUJI MATSUI

自己紹介 けきょ ロードバイク乗り Microsoft MVP for Visual Studio and Development Technology 認定スクラムマスター・スクラムプロダクトオーナー Center CLR オーガナイザー

今日のお題.NET から Win32 API を使って 、.NET だけでは難しいことをしよう

巷では UWP が流行ってますが … デスクトップアプリケーションが避けられない場面は あるはずです !! ◦ 最近はやりの IoT (Out of box unit と通信する ) ◦Microsoft Kinect や Intel RealSense カメラ ◦USB 機器 ( libusb ) ◦OpenGL / DirectX ◦ サードパーティ製ライブラリ群 … そして Win32 API

Win32 API となかよくする と言いながら 、 C++ でがりがり書くのは色々つらい 。 C# から 、 どうやって Win32 API にアクセスするか ? これが出来れば 、 いろんなことに応用できる !!

デスクトップを駆けるプロ生ちゃん ウインドウの上を走ってくよ~

WPF だけではどうにもならない … デスクトップ上のどこにウインドウがあるのか ? 表示されているウインドウが全て列挙出来れば 、 ウインドウ の上の縁の座標が分かる 。 あとは計算で何とかなりそう ? ② ウインドウの上辺が分かるので ③ 上に乗るような感じで 横に移動させる ① ウインドウの座標が分かれば

落ちた時の着地点 落ちた時の着地点は 、 現在位置 → 次の位置 ( 等加速度運動 ) で 決まる線分と 、 ウインドウ上辺が交差するところ 。 ① 現在の座標 ② 次の座標 ③ ウインドウの上辺と交差する座標 → 全てのウインドウを検査する

考え方はお k?

ウインドウを調べる デスクトップ上のウインドウを全て列挙するには 、 「 EnumWindows 」 API を使います 。 又は、 EnumWindows でググる

C# から Win32 API は直接呼べません EnumWindows を呼べば 、 すべてのウインドウの位置が分かる 。 でも C# のコードで ”EnumWindows” と書いても 、 もちろん呼び 出せない 。 こういう時には 、「 P/Invoke 」 という機能を使います 。

P/Invoke するには Win32 API に対応する P/Invoke の定義を C# で書きます 。 EnumWindows API の定義 ( C 言語による) EnumWindows API の定義 ( P/Invoke C# )

P/Invoke の定義 API がどの DLL に定義されているか? ( DllImport 属性) API 名はほとんどの場合 C 言語の API 名と同じ 引数と戻り値の並びは同じだけど、 型は要注意 ぴよぴよ

どうやって書けば ? そんな P/Invoke 初心者のために 「 pinvoke.net 」 コミュニティベースで、 Win32 API の P/Invoke 定義を蓄積

pinvoke.net 例 :「 EnumWindows dllimport 」 とかでググると 、 大抵トップ に出てくる 。 コミュニティベースの定義なので 、 定義の質はまちまち 。 複数載ってたりする ( 俺はこんな定義は我慢ならない 、 と 思ったのかも ) ので 、 良さげなやつを選択する 。 この定義をベースに 、 細かく修正するという手法はアリ 。 主に型定義によるばらつきが多い感ある あと、過剰な属性か足りないか …

EnumWindows P/Invoke の詳細 コールバック関数はデリゲート として定義できる SetLastError でエラーコードを返す API の場合は、これを追加する

EnumWindows を使う EnumWindowProc デリゲートに相当する実装。 列挙されたウインドウハンドルをリストに蓄積します。 API が失敗すると false を返すので、その場合は GetHRForLastWin32Error でエラーコードを取得して、 対応する例外を ThrowExceptionForHR でスローします。

ウインドウの矩形を得るには ウインドウハンドルからウインドウ の矩形座標を得るには、 GetWindowRect API を使います。 RECT 構造体が必要 ( LPRECT は RECT へのポインタ)

ウインドウの矩形を得るには RECT 構造体の P/Invoke 表現です。 これも pinvoke.net で探せます。 ウインドウハンドルからウインドウ の矩形座標を得るには、 GetWindowRect API を使います。

GetWindowRect を使う 呼び出すだけ。エラー処理は EnumWindows と同じ。

その他必要な API ウインドウが可視状態かどうか → IsWindowVisible ◦ 見えていないウインドウは除外します 。 デスクトップ全体の矩形を取得する → SystemParametersInfo ◦ 画面外まで移動したかどうかを判定するのに使います 。 ウインドウの矩形を再設定する → SetWindowPos ◦ プロ生ちゃんアイコンの移動に使用します 。 ( WPF データバインディングでの移動に不備があるため )

WPF ウインドウからハンドルを得る WPF のウインドウクラスからウインドウハンドルを取得すれば 、 WPF ウインドウに対して 、 Win32 API を適用できます 。 WindowInteropHelper クラスを使って、 Window クラスのハンドルを操作 内部で SetWindowPos API を呼び出す

総仕上げ デスクトップ上のウインドウ群の矩形座標が手に入ったので 上辺群を抽出 歩行中と落下中をステートマシンで管理 落下中は交点座標を計算 → 結果が得られれば着地 ! 上辺の左端を超えたら落下 画面外に出たら最初の座標にリセット アイコン ( 透過 PNG ) で透過ウインドウを作って表示 歩行時はアイコンを切り替えてアニメーション タイマーで定期的にステートマシンを実行

デモ

もっと面白くするために アニメーションパターンを増やしたいね ( レベル低 ) ◦ せっかく色々イメージがあるので … 反対にも移動したいね ( レベル低 ) ◦ 上辺の端まで来たら気まぐれで反転するとか ちゃんと終われるようにしたい ( レベル低 ) ◦ タスクトレイに常駐 ! ウインドウ移動に追従したいね ( レベル中 ) ◦ ウインドウを移動したら 、 上辺に乗っかったまま移動とか ウインドウの Z オーダーを認識したい ( レベル高 ) ◦ 裏に回っているウインドウにも着地してしまうよ ◦ 手前ウインドウにさえぎられて移動できない場合は反転とか

ご清聴ありがとうございました ! GitHub: Pronama.InteropDemo スライドはブログに上げます 第五回 Center CLR 年末会やります ( ) 名古屋市 中生涯学習センター