Windows 8」カテゴリーアーカイブ

Windows 7, 8 での3本スワイプによるデスクトップ切り替えの発表資料 / バイナリを公開しました。

どうもみむらです。

もう12月ですか・・。月日の過ぎるのは本当に早いですね。
私もいろいろなことがありすぎて、もう12月かと。そんな感じです。

いろいろと、今年は本当に反省に次ぐ反省の年だったように思います。
残った一ヶ月で、可能な限りリカバリーをしていきたいです。


2016/02/20 Update:

本記事の内容は Windows 10 環境では正常に動作いたしません。

Windows 10 環境をお使いの場合は、
Windows 10 で 3本指ジェスチャで仮想デスクトップを制御出来るようにしてみた。 – みむらの手記手帳
より、Windows 10 版をご利用ください。


 

さて、表題の件ですが、
これは各所の勉強会で2回ほど使ったネタで、
Mac の「3本指でタッチパッドをスワイプすると仮想デスクトップが切り替わる」
Mission Control のあれを Windows で実装してみた、という話です。

 

またこれは Windows 7 や 8 で動作するもので、Windows 10 のそれとはまた別ものです。

 

概要については次のスライドをご参照ください。

— 余談 —

同じネタを福岡と東京でやったのですが、
東京はかなり受けたのですが福岡の反応はイマイチでした・・。

んー。福岡受けするにはどうすれば良かったんだろう・・

— 余談ここまで —

 

 

また実際の動く雰囲気としてはこのような感じとなります

ディスプレイに対して直接描画命令を送って、スワイプしてる雰囲気を出したいなぁ・・(苦笑

 

実際の仕掛けとしては、CreateDesktop と SwitchDesktop を使って
ジェスチャを認識したらデスクトップを切り替えている流れになります。

 

CreateDesktop
http://msdn.microsoft.com/ja-jp/library/windows/desktop/ms682124(v=vs.85).aspx

SwitchDesktop
http://msdn.microsoft.com/ja-jp/library/windows/desktop/ms686347(v=vs.85).aspx

 

またジェスチャの認識には、
Synaptics 社の開発キットを用いて、タッチパッドの入力を直接取得した上で、
指の本数とその移動距離を取得して判定しています。

直接取得していますので、
Windows のウィンドウフォーカスの問題や、
Windows API レベルでのマウス操作の制約を受けません。

具体的には、仮想マシンをフル画面で表示して、
当然マウスは仮想マシンにキャプチャされている状況においても動作します。

 

その一方で機種依存がありまして
”Synaptics 社製タッチパッド搭載機” と “3本指を認識できるタッチパッド” が必要になります。

 

見分け方としましては、マウスの設定画面から “Synaptics” のデバイス設定に入り、

image

こんな感じで「3本指で・・」という項目があるコンピュータであれば利用可能です。

ただ、古い機種において、ドライバのバージョンの関係から、3本指ジェスチャを認識できるのにもかかわらず「3本指で・・」という項目がない機種も存在しますので、
使用するためにはこの項目があるマシンが必須というわけではありません。

 

また、使用の際はもちろん、この3本指ジェスチャのオプションは OFF でお願いします。
(ON のまま使用されますと、両方のジェスチャが実行され、いろいろと意図しない動作が発生する恐れがあります。)

 


限りなくベータ(もしかするとアルファかもしれない)版ですが、
バイナリデータを公開します。

ソースコードに関しましては、思いつきで書いた関係で私自身にも難読な状態になっていますので
リファクタリングを実行した上で公開致します。

 

検証環境:
マシン:Sony VAIO Pro 13, Sony VAIO Z VPCZ21AJ
OS:Windows 7 x64, Windows 8.1 x64
アプリケーション: VMware Workstation 10

ダウンロードリンク:
http://mimumimu.net/beta/programs/synaptics_switchdesktop.zip

注意事項:
・Windows 10 の仮想デスクトップ機能とは互換性がありません。
(これについてはまた別途、Windows 10 対応版を出したいと思っています。)
・Windows 8.1 において、切り替え先のデスクトップにてストアアプリおよびそれに付随する機能が使用できません。
・IE 11 やその他一部のソフトウェアにおいて、切り替え先のデスクトップで正常に動作しないソフトウェアが存在します。ご了承ください。

 

要望等ありましたら、可能な範囲で対応します・・
https://mimumimu.net/community/
https://mimumimu.net/bbs/

ExQueueWorkItem を使って PASSIVE_LEVEL で呼び出せる命令を他の IRQL から実行させる。

どうもみむらです。

 

最近とある用があってカーネルモードドライバを書くことが出てきました。
なんだかんだ、Linux 用のドライバも Windows 用のドライバも慣れると楽しいですね。

(ブルースクリーンに行かないように考えながらコードを書くのが良い感じに脳みその体操になってとっても楽しいです。 気を抜くとすぐにブルースクリーンになりますし。)

 

さてさて。

Windows なカーネルモードドライバを書いている上でなかなかに問題になることの一つに
IRQL の話があると思います。

詳しくはこちらのウェブサイトに詳しくまとめられていますのでそちらにお任せするとして。
http://d241445.hosting-sv.jp/community/report/report11.html

要は各割り込みに優先度を付けて、すぐに行わなければならないやつをすぐに行えるようにする・・と
おおざっぱですがそのような感じです。

 

また各 IRQL によって実行可能な API が限られており、
もしそれを無視して実行すると

image

こんな感じで、 “IRQL_NOT_LESS_OR_EQUAL” な BSoD が発生します。
(ちなみにこれは KeBugCheckEx に 0xA と適当(?)な数字を設定して呼び出しました。)

 

各種コールバックでは DISPATCH_LEVEL でやってくるケースもあり、
PASSIVE_LEVEL でのみ呼び出せる関数をどうやって呼び出すか。


今回の一件は、
フィルタを挟み込んでデータをファイルに書き出すというようなドライバを書いていて、
どこかのタイミングで書き出せればいいと考えて、

ExQueueWorkItem を DelayedWorkQueue で呼び出して、
呼び出し先にファイル書き込みを書く・・という方法で対処しました。

 

コードとしてはこんな感じ

#include <Ntifs.h>
#include <ntddk.h>
#include <Ntstrsafe.h>

#define STR_LENGTH 0x1000

typedef struct _DATA
{
	LARGE_INTEGER time;
	wchar_t str[STR_LENGTH];
} DATA, *PDATA;

void _PassiveWrite(PDATA);

/* 外部から呼び出される関数。ここは IRQL <= DISPATCH_LEVEL であれば実行可能 */
void Write(PDATA d)
{
	WORK_QUEUE_ITEM workitem;
	PDATA data;

	/* 非ページプール上に領域を確保する */
	data = (PDATA)ExAllocatePoolWithTag(NonPagedPool, sizeof(DATA), 0x0616);
	if(data == NULL)
		return;

	/* データを準備する。 */
	ExInitalizeWorkItem(&workitem,_PassiveWrite,data);
	memcpy_s(data,sizeof(DATA),d,sizeof(DATA));

	/* Queue に登録する */
	ExQueueWorkItem(&workitem, DelayedWorkQueue);
}

/*
ExQueueWorkItem によって登録され、実行可能になった時に呼び出される。 
ここの IRQL は PASSIVE_LEVEL になる
*/
void _PassiveWrite(PDATA data)
{
	HANDLE handle;
	NTSTATUS status;
	UNICODE_STRING str;
	IO_STATUS_BLOCK statusblock = {0};

	/* ファイルオープン */
	{
		UNICODE_STRING path;
		OBJECT_ATTRIBUTES attr = {0};

		RtlInitUnicodeString(&path, L"\\??\\C:\\Logs\\nonohara.log");
		InitializeObjectAttributes(&attr,&path,
			OBJ_CASE_INSENSITIVE | 
			OBJ_KERNEL_HANDLE |
			OBJ_FORCE_ACCESS_CHECK,
			NULL, NULL);

		status = ZwCreateFile(
			&handle,FILE_APPEND_DATA,
			&attr,&statusblock,NULL,
			FILE_ATTRIBUTE_NORMAL,
			0,FILE_OPEN_IF,
			FILE_SYNCHRONOUS_IO_NONALERT,
			NULL,0
		);
		
	}

	if(!NT_SUCCESS(status))
	{
		ExFreePoolWithTag(data,0x0616);
		return;
	}

	/* 書き込む文字列を作る */
	str.Buffer = ExAllocatePoolWithTag(NonPagedPool,STR_LENGTH*2,0x1133);
	str.MaximumLength = STR_LENGTH*2;
	str.Length = 0;

	RtlUnicodeStringPrintf(&str,L"%I64u,%s\r\n",
		data->time,
		data->str
	);

	/* 書き込む */
	ZwWriteFile(handle, NULL, NULL, NULL, 
		&statusblock, str.Buffer, str.Length, NULL, NULL);

	/* バッファーをクリアする */
	ZwFlushBuffersFile(handle,&statusblock);
	ZwClose(handle);

	/* メモリを解放する */
	ExFreePoolWithTag(str.Buffer, 0x1133);
	ExFreePoolWithTag(data, 0x0616);
}

 

たとえばこれを応用して、

ドライバを開始したタイミングでファイルを開いてハンドルを握っておき

(その間、共有状態で CreateFile をしていないので他からのアクセスがロックされる。)

ドライバが停止するタイミングでバッファをフラッシュしてクローズする・・とか。

(その間バッファリングが効くので、たぶん良い感じになる・・はず)

 

後は何か、特定の動作があった場合に何かを呼び出すとかそういうのが書けます。

 

・・・とりあえず、個人的なメモ。

誰かドライバを書いていてこの記事で解決することがあれば・・。

Hyper-V で ディスクの最適化をしても VHDX ファイルが縮まらない場合。

みむらです。何となくメモ。

image

Hyper-V において、こんな感じで仮想ハードディスクに対して最適化を行っても縮まらない場合。

 

1. 事前にゲストOS 上で 空き領域を 0-fill しておく。

2. PowerShell を起動して、 Users\Public\Documents\Hyper-V\Virtual hard disks に移動。

image

3. “Optimize-VHD [縮めたい vhdxファイル] –Mode Prezeroed” を実行。

image

ということで、終われば縮まります。

Windows 8 と ストアアプリとスタートスクリーンと

みむらです。

Windows 8 をもう1年半ぐらい使ってます。
Developer Preview あたりで自分のマシンを全部切り替えてどんなもんかと見ていますので、
先ほど wikipedia を見てきてびっくりしていました。

そんなこんなで。

結構賛否が分かれるスタートスクリーン。

慣れちゃえば使えるよね という声から、
それ慣れてるの、あなただけだから みたいな声まで。

 

私はもう慣れているんですが、
慣れていない人、特にこれから使ってみようという人向けに、
スタートスクリーンどうしようかという記事ってあんまり無いよなーと思いまして、
ふと書いてみました。

 


スタートスクリーン:

image

 

私のスタートスクリーンはこんな感じです。
よく使うアプリを最初の画面のうち、横に移動しなくても表示される範囲に配置してあります。

そして、ニュースや people, メールなど、
最初に確認したいと思うものよく使うもの左側から配置していきます。

これに並べ直すだけでも、結構使いやすくなるかと思います。

こうすると、最初にマシンが立ち上がった時に、メールが何通だとか、
今日のトレンドはどういうことだとか、
ニュースはどういうことだとか。

そういうのが一発でわかります。

 

同様に、作業が一段落したときも、 Windows キーを一回押してこのスクリーンに遷移すれば、
そういうものがすぐに確認出来ます。

そういう点で、従来みたいにいろんなサイトに移動したり、いろんなアプリを立ち上げたりする手間がなくなった分、
いいのかなと思います。

 

纏める際は、グループ化して纏めておくと探しやすくなります。
といっても、最初に表示される画面内だけ整理整頓しておけばいいと私は思ってます。

普段、身の回りの作業をこなすときを想像すると、よく使うものだけ整理しておけば、
案外そこまで困らないというのがわかるんじゃないかと思います。
また同時に、よく使うものは結構限られているので、それだけしっかりしておけばいい・・みたいな。

 

ただ、スタートスクリーンが無駄に大きくなるのも後で探しづらくなりますので、

image

出しておく必要が無いアプリアイコン (今後呼び出すことがなさそうなもの) は、
どんどん「スタート画面からピン留めを外す」を選択して、消していくといいと思います。

ここから消しても、ショートカットの情報自体は残りますので、
後から検索で見つけることも出来ます。

いらない! と思ったらぼんぼん外しちゃうことが重要かとおもいます。

最近はやりの、「きらめきますか?」 というあの仕分け術のように・・。

 

 

そして、スタートスクリーンからのアプリの呼び出しで覚えておくといいと思うのは、
アプリ名じゃないかと思います。

スタートスクリーンを表示した状態で、そのままキーボードをタイプすると、

pics4

このように検索画面へと遷移します。

特別な操作は何も必要なく、
Windows キー を押して、すぐに起動したいものの名前を打ち始めればおっけーです。

 

また、 Windows 7 まではあんまり日本語の処理がよくなかったかと思うのですが、

pics3

Windows 8 ですと、ひらがなでばっちり検索にヒットするようになりました。

 

そして、目的のアプリが選択されていたら、 Enter キーで起動できます。
カーソルの移動は十字キーで。

・・マウスでやってもいいのですが、キーボードから手を離さないように操作できると、
すてきだと思います。

 

・・・この辺のデザインの話は、 Building Windows 8 の記事を見るといいとおもいます。
http://blogs.msdn.com/b/b8_ja/archive/2011/10/19/start-comments.aspx

 

 


デスクトップアプリ:

image

デスクトップ上では、タスクバー上によく使うものを纏めておけばいいかと思います。

※なお、Windows 8 上のマルチディスプレイでのタスクバーの挙動については、以前の記事を参照してください。

 

タスクバー上のアプリケーションを多重起動する際は、Shift キーを押しながらクリックすれば起動できます。

 

このあたりは、Windows 7 とほとんど変わらないので割愛。

 


ストアアプリ:

正直まだまだこれからなのかなーと思います。

ただ、メールアプリや MetroTwit を使っていて思うこととしては、
Mac と同じような通知機能が搭載されたことと、スタートスクリーン上で通知が確認出来る点が大きいかなと。

image

例えばこういうので、メールが何件未読であるかがわかり、

image

こういうところで、今のニュースはどういうのがトップニュースなのかがわかります。

image

作業している時に右上にぴょこーんと通知が。

例えば、 IMAP でメールサーバと接続されている場合、メール新着の通知がサーバから飛んできますので、
受信した時にぽーんと。

素早い対応を取ることが出来ます。

 

ぼかしてありますが、メールの件名と内容の先頭部分が出ますので、
対応すべきメールであればそこですぐに対応できます。

 

 

ただ、ストアアプリについては先述の通りまだまだかなーと思う点があって、
諸事情からものすごくごめんなさい という状況ではあるのですが。

 

私としては、「このアプリこれできないのー。。従来のでいいじゃん。。」というのがあったら、
是非ともストアアプリ上に起こして行けたらなと思っています。

(そういうわけなので、何かあればいつでも言っていただけたらありがたいのですが・・w

 

もちろん、従来アプリで満足できてしまうという点はよくわかるのですが
(私も使い始めて半年間ぐらいはそうでした) こういう機能を有効活用された環境で作業をすると、
より本来の作業に注力できるのではないかと思いました。

私も Visual Studio を開いてコードを書いていることがよくあるのですが、
以前の環境ですと、メールが気になったりとか、
何か小休止するときにウェブサイトをぶらぶらして時間を使うということが非常に多かったのですが、
結構これのおかげで、小休止を適切に取りつつも、だらだらせずに作業に復帰できているようにも思います。

・・・まぁ、 MetroTwit を動かしていたりしますと、リプライ通知がでてきて、
作業が妨害されてしまうこともないわけではないのですが。。

そんなこんなで、もしよかったらこの環境で使ってみては、と、ふと思います。

 


追伸:

image

授業中のデスクトップをこういうふうにすると・・いやいや。
でも、Twitter をやりつつも、授業ページを見たり、実習をしっかりやれたりしてある意味おすすめ・・いやいや。

なんでもないです。

 

※たぶんジョークです。

マルチディスプレイ環境での Win8 のタスクバーの挙動について。

そういえば、案外気づかれにくい箇所なのかもとふと。
タスクバーに関しても機能強化されてます。

image

こんな感じで2枚のディスプレイをつないだときに、両方にタスクバーが出ます。
(もちろん、メインディスプレイのみの表示も可能)

 

image

ただ、このタスクバー。 プロパティを開くと Win7 時代にはなかった
「複数ディスプレイ」に関する項目が増えています。

image

開いてみるとこんな感じ。 デフォルトは「すべてのタスクバー」になっています。

image

その場合はこんな感じ。

別々のディスプレイで Windows Live Writer と Paint.net を開いていますが、
タスクバーはどちらも同じ状態。

 

ここで、タスクバーボタンの表示先を
「開かれているウィンドウのタスクバー」に切り替えます。

image

そうするとこんな感じ。

image

メインディスプレイとして指定してある左側には、ピンと、そのディスプレイに表示されているウィンドウ。
サブディスプレイとなる右側には、そのディスプレイで表示している Paint.NET がタスクバーに表示されます。

 

こんな感じでカスタマイズができるようになっています。


まとめるとこんなかんじ:

「すべてのタスクバー」にした場合は、
開いているウィンドウの項目がすべてのウィンドウのタスクバーに表示されます。

image

 

「開かれているウィンドウのタスクバー」にした場合は、
ウィンドウが表示されているディスプレイのタスクバーにのみ表示されるようになります。

image