IE10 から Office Web Apps を使ってみよう…としたが使えん

windows 8 consumer preview を acer w500 に入れて、MS-Office 2010 を入れて、と程よく環境が整ってきたので、既存のアプリケーションが使えるかどうかテストしていきます。

スレートPCにwindows 8を入て使う理由の大きなものとして、

  • iPadでExcel/Wordを扱うよりも、Windowsで扱うほうが正統であろう。
  • iPadアプリを作るよりも、Windowsアプリのほうが(私には)作り易い。

という点です。Androidが入っていないのは、手元にないというのが副要因、Linux+Javaの組み合わせであればLinuxを弄りたいのにってのが主要因だったりします。

それはさておき、ms-office を扱うのには、windows os が良かろうというのが結論です。

■Office Web Apps

Office Web Apps について | Microsoft Office 2010
http://www.microsoft.com/ja-jp/office/2010/webapps/default.aspx

「Office Web Apps」ってのは、「Office 365」の前身で Web 上で Word/Excel が扱えるブラウザアプリケーションです。Windows Live ID を登録すれば使えば無料で扱えるので、これだけ使うのであれば Office 365 を購入する必要はありません。まあ Office 365 の場合は、それ以外の機能がはいっているので、Word/Excel だけではないのですが。

■Excel の場合

結論から言うと、スレートPCで Office Web Apps は利用に耐えません。

こんな風に、一応閲覧はできます。上下スクロールもスムースに動くのですが、左右のスクロールがまずい。metro IE10 の場合、画面を右にスライドさせると、左からブラウザで表示した前の画面がでてきます。いわゆる「戻る」ボタンと同じ動作で、通常のブラウジングをしているときは便利なのですが、Ajax のようなアプリケーションの場合はこれが鬼門です。

こんな風に、指で左にスライドさせると前の画面(ドキュメントのリストの画面)がでてきます。これが意図した状態だったらいいのですが、Excel シートが横に長くて元の列(A列など)に戻そうとしてスライドさせていくと、勢い余って前の画面が出てきてしまうのです。前の画面を表示した時は「戻る」と同じ状態になるので、途中の閲覧や編集状態が消えてしまうんですよね。この「勢い余って」なのですが、閲覧をしてみるとかなり頻繁に発生します。なので「気を付けて」閲覧をしている分には問題ないのですが、結論としては「利用に耐えない」という結果になります。

ブラウザアプリケーションは、Ajax を使ってブラウザ上でドキュメントなどを編集することができる、ってのが売りなのです。Office Web Apps も非常に高機能な Ajax を使ってこれを実現しているのですが、

IE10 metro で動作させた場合には、ソフトキーボードのおかげで最初の10行しか見えません。しかも、セル上で編集をすることができなくて、必ず数式バーで編集しないといけないのです。これは、デスクトップPCとマウスで動かしたときはセル上で編集が可能なのですが、スレートPCだと数式バーのみになります。明らかに動きが変です。
例えば、100行目のセルを編集したいときは、一度100行目まで移動させてから上の数式バーにスクロールさせるという手間…と言いますか、実はこれすらできません。

何かのはずみで、下の行にどうやっても移動できないのです orz これはちょっとまずいかなぁと。

■Word の場合

Word の場合は、新規のDocumentを作ってタイピングしてみたのですが、なんか行がおかしくて入力すらまともにできません。

■Power Point の場合

唯一まともに動きそうなのが Power Point です。

一応、閲覧と編集ができることまでは確認できたのですが、画面のずれなどからちょっとお金をとるには厳しいという品質です。

■結論

という訳で、どこからどう突っ込んだら良いものやら…という具合で。おそらく、office web apps のほうを治さないといけないのと、consumer perview がどの段階なのかが問題なのですが、ひとまず microsoft connect あたりに一発投げておきますか。

■google docs では?

ちなみに google docs は metro IE10 ではまともに動きません。まぁ、iPad の safari 上でもまともに動かない(safari 自体が落ちてしまう)ので、なんとも言えませんが。

 

カテゴリー: 開発, windows 8 | 1件のコメント

Windows 8 用のミニソフトキーボードを作る(2)

win8 の metro アプリケーションを作る前段階として WPF アプリケーションを作ればよいので(Windows Phone アプリでもいいのだけど、win phone の方は私はノータッチなので)、画像のタッチイベントを実装してみます。

■WPF コントロールに画像を貼りつけ

WPF アプリケーションに画像を貼り付ける時には、Image コントロールを使うのですが、ちょっとコツがいります。

<UserControl x:Class=&quot;MiniSoftKey.UserControl1&quot;
             xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
             xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
             xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
             xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
             mc:Ignorable=&quot;d&quot;
             d:DesignHeight=&quot;216&quot; d:DesignWidth=&quot;320&quot;
             TouchDown=&quot;UserControl_TouchDown&quot;
             TouchUp=&quot;UserControl_TouchUp&quot;
             TouchMove=&quot;UserControl_TouchMove&quot;>
    <Grid>
        <Image Height=&quot;216&quot; HorizontalAlignment=&quot;Left&quot; Name=&quot;image1&quot; Stretch=&quot;Fill&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;320&quot;
               Source=&quot;/MiniSoftKey;component/Images/iphone_alpha_normal.bmp&quot; />
    </Grid>
</UserControl>

ここでは、リソースから「iphone_alpha_normal.bmp」というファイルを貼り付けているんですが、普通に「Stretch=”None”」(伸長しない)で張り付けると、

のように拡大されてしまうんですよね。ビットマップファイルのサイズは、320×216 にしてあるので、丁度なはなずなのですが…って、これは画面のDPI(96dpi)に起因するそうで「デバイス非依存ビットマップ」というものを使っているからです。デバイス非依存ビットマップで表示すると、ディスプレイの1ドットとビットマップの1ドットは違う、という…DTP的にはいいんでしょうが、なんともプログラマ泣かせといったところです。

じゃあ「デバイス依存ビットマップ」で表示すれば良いのでは?と思ってネットを探してみたのですが、なんだかうまい方法が見つかりませんでした。なので、仕方がないので、Image コントロールの width と height を画像の縦横に合わせて「Stretch=”Fill”」にしておきます。リソースから直接 width/height を取る方法もあるのですが、今回は画像の切り替えも行うので、こんな風にしておきます。

ちなみに、画面が96DPIの場合には、画面に表示されるサイズは4/3に拡大されます。なので、画面表示から3/4すれば元のビットマップのドット数になりますね。

画像ファイル(bmpファイル)自体は、プロパティのビルドアクションを「Resource」に変更しておきます。そうすると、先の xaml のように「Source=”/MiniSoftKey;component/Images/iphone_alpha_normal.bmp”」でアクセスが可能です(これは自動的に変換されます。「MiniSoftKey」はプロジェクト名です)。
# ただし、metro の場合は、逆に「コンテンツ」のままにしておきます。「ms-xapp:////Images/iphone_alpha_normal.bmp」な感じでアクセスが可能です。これもハマりました orz

■タッチイベントの取得

タッチイベント自体は、TouchDown/TouchUp/TouchMove で取ります。これはマウスで操作するときの MouseDown/MouseUp/MouseMove にあたります。ただし、TouchMove のイベントは「タッチし続けている状態」に限られます。当然ですが、指が浮いている間はイベントは取れません。このあたりは MouseMove と違うところですね。ちなみに、metro アプリの場合は、PointerDown などのイベントになります。

private void UserControl_TouchDown(object sender, TouchEventArgs e)
{
	GlobalData.MainForm.label1.Text = "touch down";
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseDown(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

private void UserControl_TouchUp(object sender, TouchEventArgs e)
{

	GlobalData.MainForm.label1.Text = "touch up";
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseUp(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

private void UserControl_TouchMove(object sender, TouchEventArgs e)
{
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseMove(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

ミニキーボードの場合は、acer 上のタッチイベントだけを対象にしていますが、本来は mouse と touch の両方のイベントを取って整合性を合わせないとだめなんですよね。指でタッチをしても、mouse イベントは発生するので、このあたりが面倒です。逆に、デスクトップPCでマウス操作した時は、touch イベントは発生しません。
metro アプリの場合は、mouse/touch/pen のイベントが pointer というひとつのイベントにまとめられているので、このあたりはプログラミングが楽になっています…が、イベントの順序までは未調査なので、両用のアプリを作るときにはどうなるのやら。

■画像の切り替え

動的に画像を切り替えるときは、BitmapImage オブジェクトを作成した後に、Image コントロールの Source プロパティに設定します。

public void Form1_MouseUp(object sender, MouseEventArgs e)
{
	//label1.Text = "mouse up";
	if (_pop != null)
	{
		_pop.Close();
		_pop = null;

		BPos pos = CalcBCode(e.X, e.Y);
		_send.Sendkey(pos.Code);
		if (pos.Code == "shift")
		{
			if (_send.shift_mode == true)
			{
				BitmapImage bi = new BitmapImage(new Uri(@"Images/iphone_alpha_shift.bmp", UriKind.Relative));
				userControl11.image1.Source = bi;
			}
			else
			{
				BitmapImage bi = new BitmapImage(new Uri(@"Images/iphone_alpha_normal.bmp", UriKind.Relative));
				userControl11.image1.Source = bi;
			}
		}
	}
}

ちょっと無駄なコードが入っていますが、こんな感じ。UriKind.Relative を付けて画像リソースを相対パスで拾ってきます。多分、内部的に「Source=”/プロジェクト名;component/」が付けられたと同じような動作になるのだと思います。

■画像のどのキーが押されているのか?

ここからは、ちょっとおまけ。プログラミングノウハウの話。
先のキーボードは単なる画像ファイルです。ボタン自体をちまちまと作っても良かったのですが、ひとまず某iPhoneの真似をしたかったので、そのままキャプチャしました。で、どのボタンが押されているのかを調べるのに、普通はキーのサイズをちまちまと測って、Rectange をチェックすれば…良いのですが、結構な手間になります。まあ、仕事ならそれでもいいけど。

という訳で、次のように少しトリッキーな方法を使います。

private void InitBPos()
{
	/// 標準キーボード
	_blist = new List<BPos>();
	_blist.Add(new BPos { Code = &quot;Q&quot;, X = 15, Y = 30 });
	_blist.Add(new BPos { Code = &quot;W&quot;, X = 47, Y = 30 });
	_blist.Add(new BPos { Code = &quot;E&quot;, X = 82, Y = 30 });
	_blist.Add(new BPos { Code = &quot;R&quot;, X = 111, Y = 30 });
	_blist.Add(new BPos { Code = &quot;T&quot;, X = 145, Y = 30 });
	_blist.Add(new BPos { Code = &quot;Y&quot;, X = 174, Y = 30 });
	_blist.Add(new BPos { Code = &quot;U&quot;, X = 208, Y = 30 });
	_blist.Add(new BPos { Code = &quot;I&quot;, X = 238, Y = 30 });
	_blist.Add(new BPos { Code = &quot;O&quot;, X = 271, Y = 30 });
	_blist.Add(new BPos { Code = &quot;P&quot;, X = 301, Y = 30 });
	_blist.Add(new BPos { Code = &quot;A&quot;, X = 31, Y = 85 });
	_blist.Add(new BPos { Code = &quot;S&quot;, X = 65, Y = 85 });
	_blist.Add(new BPos { Code = &quot;D&quot;, X = 94, Y = 85 });
	_blist.Add(new BPos { Code = &quot;F&quot;, X = 127, Y = 85 });
	_blist.Add(new BPos { Code = &quot;G&quot;, X = 161, Y = 85 });
	_blist.Add(new BPos { Code = &quot;H&quot;, X = 191, Y = 85 });
	_blist.Add(new BPos { Code = &quot;J&quot;, X = 223, Y = 85 });
	_blist.Add(new BPos { Code = &quot;K&quot;, X = 256, Y = 85 });
	_blist.Add(new BPos { Code = &quot;L&quot;, X = 286, Y = 85 });
	_blist.Add(new BPos { Code = &quot;Z&quot;, X = 61, Y = 137 });
	_blist.Add(new BPos { Code = &quot;X&quot;, X = 94, Y = 137 });
	_blist.Add(new BPos { Code = &quot;C&quot;, X = 125, Y = 137 });
	_blist.Add(new BPos { Code = &quot;V&quot;, X = 161, Y = 137 });
	_blist.Add(new BPos { Code = &quot;B&quot;, X = 191, Y = 137 });
	_blist.Add(new BPos { Code = &quot;N&quot;, X = 223, Y = 137 });
	_blist.Add(new BPos { Code = &quot;M&quot;, X = 256, Y = 137 });
	_blist.Add(new BPos { Code = &quot;BS&quot;, X = 298, Y = 137 });
	_blist.Add(new BPos { Code = &quot; &quot;, X = 155, Y = 193 });
	_blist.Add(new BPos { Code = &quot;n&quot;, X = 279, Y = 193 });

	_blist.Add(new BPos { Code = &quot;shift&quot;, X = 20, Y = 137 });
}
private BPos CalcBCode(int x, int y)
{
	// 距離が近いものを取得
	int len2 = 10000;
	BPos pos = _blist[0];
	foreach (var p in _blist)
	{
		int l2 = (p.X - x) * (p.X - x) + (p.Y - y) * (p.Y - y);
		if (l2 < len2)
		{
			len2 = l2;
			pos = p;
		}
	}
	return pos;
}

各ボタンの中央の座標だけを取得したリストを作っておいて、タッチした座標と一番近いボタンを返す、という CalcBCode 関数ですね。これは、画像処理のクラスタリングの応用で「画面の何処をタッチしても、なんとなくボタンが押せる」という技です(笑)。全スキャンするので、数が多い場合にはスピードが問題になるのですが、これぐらいならば大丈夫。ただし、スペースバーのように横に長い場合は、中央の座標だけでは足りないので、適当に左右にも点を必要としますが(上記のソースにはそれが入っていません)。

public void Form1_MouseUp(object sender, MouseEventArgs e)
{
	//label1.Text = "mouse up";
	if (_pop != null)
	{
		_pop.Close();
		_pop = null;

		BPos pos = CalcBCode(e.X, e.Y);
		_send.Sendkey(pos.Code);

具体的にキーの送信自体は、keybd_event 関数を使います。UpとDownをきちんと対応させないと駄目なのですが、普通にIMEも使えるので、これがベストな方法でしょう。

class SendKeyCode
{
	[DllImport("user32.dll")]
	public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
	const byte VK_SHIFT = 0x10;
	const byte VK_CONTROL = 0x11;
	const byte VK_MENU = 0x12;
	const byte VK_LWIN = 0x5B;
	const byte VK_RWIN = 0x5C;
	const byte VK_APPS = 0x5D;

	public bool shift_mode = false;

	public void Sendkey(string code)
	{
		// return;

		if (code == "shift")
		{
			shift_mode = !shift_mode;
		}
		#region 特殊キーダウン処理
		/*keybd_event(VK_SHIFT, 0, 0, (UIntPtr)0);
            keybd_event(VK_CONTROL, 0, 0, (UIntPtr)0);
            keybd_event(VK_MENU, 0, 0, (UIntPtr)0);
            keybd_event(VK_LWIN, 0, 0, (UIntPtr)0);
             */
		if (shift_mode) keybd_event(VK_SHIFT, 0, 0, (UIntPtr)0);
		#endregion

		byte cd ;
		switch (code)
		{
			case "n": cd = 13; break;
			case "BS": cd = 8; break;
			default:
				cd = (byte)char.ConvertToUtf32(code, 0);
				break;
		}

		keybd_event(cd, 0, 0, (UIntPtr)0);
		keybd_event(cd, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);

		#region 特殊キーアップ処理
		/*keybd_event(VK_SHIFT, 0, 2, (UIntPtr)0);
            keybd_event(VK_CONTROL, 0, 2, (UIntPtr)0);
            keybd_event(VK_MENU, 0, 2, (UIntPtr)0);
            keybd_event(VK_LWIN, 0, 2, (UIntPtr)0);
             */
		if (shift_mode) keybd_event(VK_SHIFT, 0, 2, (UIntPtr)0);
		#endregion
	}

}

とこんな感じで作っていきます。

アルファベットキーボードで打っていたのですが、

  • アルファベットと数字の切り替えが面倒くさい。
  • カーソル移動やIME変換の場合には、カーソルキーがあったほうが良い

ので、単純に某iPhoneキーボードを流用するだけでは操作性に難点が出ます。acer の画面自体、iPhone よりも広いので、もっと大きくキーボードの領域が取れます。
ひとまず、某iPhoneキーボードの移植が終わったら、独自のキーボード(101か106キーボード)のデザインを考えてみましょうか。

~~
追記 2013/07/05

コメントで要望があってので、サンプルソースをアップしておきます。
http://sdrv.ms/17On4Fc
からダウンロードできます。
(中にあるキーボードのキャプチャは、まあ、試験的な画面キャプチャということで)

カテゴリー: 開発, C# | 6件のコメント

Windows 8 用のミニソフトキーボードを作る(1)

ここのところ、acer w500 での windows 8 環境を整えるのに四苦八苦していましたが、なんとなく開発環境が整ったのでお試しコーディングを開始します。

開発環境としては、

  • windows 8 customer preview 版を acer w500 にインストール
  • windows 8 customer preivew + visual studio 11 beta を vaio type s にインストール
  • windows 7 上で visual studio 2010 で開発

という具合です。acer と vaio はデスクトップPCから、リモートデスクトップで接続して操作します。スレートPC(タブレットPC)を使うのは、実際に動かして試してみるためですね。visual studio 11 beta には metro アプリを動かすための「シミュレーター」の機能があるのですが、vaio type s が多少非力(cpu 1.6GHz)なのとタッチ操作自体は実機のほうがやりやすい(ユーザーインターフェースを考察しやすい)ので、この構成になっています。

win8cp + vs11beta の組み合わせは、vmware でも可能なのですが、win8cp のパフォーマンスチューニングがいまひとつなのか、実用に耐えるスピードで vs11beta を動かせませんでした
なので、多少遅いですが、win8+vs11 の組み合わせは仮想環境ではなくて実際のマシンに入れるのが得策です(イライラして、創造力が失われますからね)。

さて、普通ならば metro アプリをと思うところなのですが、ひとまず win8 のデスクトップアプリを作ってみます。つーか、acer で win8 を使うと、ソフトキーボードの大きさに辟易するのでこれをなんとかしたい、というのが今回の主旨。実は、iPad も同じ問題を抱えていて、メモを取るだけでも画面の半分以上を占有してしまうという状態なのです。

iPad の場合

windows 8 の場合

まあ、タブレットPCで両手打ちをするのであれば、これが選択肢として上がるのは仕方がないのですが、折角の貴重な画面の半分をキーボードに占有されるのは「閲覧性が悪い」というわけで、コンセプトデザイン(苦笑)的に作ってみました。

何処かで見たようが画面なのは、さておき…某iPhoneでこのサイズで打っている訳だから、タブレットでも打てない訳はないよね、という具合です。

■製作開始の前に

で、単純にマウス/指でぽちぽち打つ分には、mouse click か mouse down/up を取ればよかろうと思っていたのですが、意外とハマりました。

  • ソフトキーボードの画面を前面に出てこないようにする。
  • マウスと指のタッチイベントが、win form, wpf, metro で異なる。

ところですね。後、諸々出て来そうなのですが、まだ製作途中なので。

■ソフトキーボードの画面を前面に出す

C#で2ch専用ブラウザをつくろう スクリーンキーボードの作成
http://cs2ch.blog123.fc2.com/blog-entry-85.html

を参考にして、ウィンドウスタイルに WS_EX_NOACTIVATE を設定します。設定の仕方は、Form クラスの CreateParams プロパティをオーバーライドという方法。これが一番正当なやりかたです。

private const int WS_EX_NOACTIVATE = 0x8000000;
protected override CreateParams CreateParams
{
	get
	{
		CreateParams p = base.CreateParams;
		if (!base.DesignMode)
		{
			p.ExStyle = p.ExStyle | (WS_EX_NOACTIVATE);
		}
		return p;
	}
}

ソフトキーボード自体にボタンを付ける場合には、ボタンコントロールがアクティブにならない様にします。今回は、iPhone の画面キャプチャをそのまま使うために、ボタンスタイルの変更はしなかったのですが、こんな風に ButtonEx クラスを作って貼りつけるそうです。

class ButtonEx : Button
{
    public ButtonEx()
    {
        //アクティブにしたくなウインドウ(Form)に配置する
        //コントロールは下記をつけないと駄目
        base.SetStyle(ControlStyles.Selectable, false);
    }
}

これで、メモ帳(win8の場合は出すのに苦労しますが)などにキーを送ることができます。キーの送信自体は、keybd_event 関数を使えば ok です。

■タッチイベントを拾う

ウィンドウをアクティブにしないほうは簡単にできたのですが、実はタッチイベントのほうが実は大変でした。

こんな風に、iPhone でキーを操作した時みたいに、ボタンの上にガイドを出したかったのです。iPad/win8 のソフトキーボードが大きいのは、両手で打てるように作っているのもそうですが、指でキートップの刻印が隠れてしまうのが主原因と思われます。ハード的にキーボードが別になっている場合は、ブラインドタッチが基本だったり、キートップを見ながらぽちぽち打つサイズになっているのでそれなりに大きくなります。
キー付きの携帯電話の場合、キーサイズが小さくなりますが、何処を押しているか(何処を押せばよいのか)は、ボタンの凹凸で分かります。しかし、iPhoneのようなスマートフォンの画面を直接操作する場合は、通常のボタンのようなハード的なフィードバックがないのでキー自体が探しづらいのですよね。
なので、apple はキーの上にガイドを出すように決めたのです(これが特許になっているかどうかは不明です)。ワタクシ的に云えば、iPad にも同じようなサイズのソフトキーを付けて欲しかった(付けてほしい)ですね。

このガイドを出すのに、普通のデスクトップアプリならば、

  • マウスがポイントされたとき(mouse overイベント)
  • マウスを押した時(mouse downイベント)

のどちらかで表示させます。しかし、タブレットの場合は、マウスとは違って mouse over というイベントは発生しません。当然、指が空中に浮いている間はタブレットはそれを判別できないので、最初のイベント mouse down になります…というハズなのですが、実は違います。

windows にはマウスの右クリックというイベントがあるので、これをエミュレートするために、タブレットPCの場合は「指を長押ししたときに右クリックと見なす」という処理が os に入っています。なので、指で画面を押した瞬間には、mouse down イベントが発生しないのですよ。これがハマりどころです。
「マウス」と「指」とはかなり操作が違うことを覚えてておかなければなりません。

windows xp のTable PCでは、Microsoft.Ink というクラスライブラリがあって、これを使えるのですが、windows 8 にはありません(多分、windows 7 にもありません)。

Microsoft.Ink 名前空間
http://msdn.microsoft.com/ja-jp/library/microsoft.ink(v=vs.90).aspx

じゃあ、windows 8 のデスクトップアプリ(非metroアプリ)ではどうするかというと、WPFアアプリ/コントロールを使います。

UIElement.TouchDown イベント (System.Windows)
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.touchdown.aspx

XAML のコントロール(UIElement)には、TouchDownというタブレット用のイベントが用意されています。試すと分かるのですが、mouse down イベントは違ったタイミングで呼び出され、きちんと「指で画面を押した瞬間」にイベントが発生します。
ちなみに、スタイラスを使ったときの StylusDown イベントもあるのですが、指との違いはなんでしょうかねぇ?スタイラス自体に何かの機能があるときは、こっちのイベントが呼び出されるのかもしれません。

という訳で、タッチダウンのイベントは、以下のように取ります。

private void UserControl_TouchDown(object sender, TouchEventArgs e)
{
	GlobalData.MainForm.label1.Text = "touch down";
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseDown(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

private void UserControl_TouchUp(object sender, TouchEventArgs e)
{

	GlobalData.MainForm.label1.Text = "touch up";
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseUp(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

private void UserControl_TouchMove(object sender, TouchEventArgs e)
{
	TouchPoint pos = e.GetTouchPoint(this);
	GlobalData.OnMouseMove(new System.Drawing.Point((int)pos.Position.X, (int)pos.Position.Y));
}

GetTouchPoint メソッドは、マウスの位置を取得するものです。対象コントロールからの相対位置になります。今回は、画像を貼りつけ(Imageコントロール)を使っているので、重宝します。ちなみに、マウス位置をおなじみの「System.Windows.Forms.Cursor.Position」で取得しようとすると、「指」と「マウス」の違いで四苦八苦します。具体的には TouchDown イベントが発生したときには、System.Windows.Forms.Cursor.Position の値は更新されていません。故に、以前のマウス位置(タッチ位置)が取得されてしまうという厄介な出来事が起こります。

GlobalData.OnMouseDown 関数は、form コントロールの上に xaml のコントロールを貼りつけているので、イベントをアップさせるための自作の仕組みです。このあたりは、全面的に WPF アプリケーションで作れば不必要だと思います。

■metro アプリのタッチイベントは?

ちなみに、metro アプリのタッチイベントは WPF アプリとは異なります。

IE10のタッチイベントってなんだろう – vantguarde – web:g
http://web.g.hatena.ne.jp/vantguarde/20110915/1316013489

これは、javascript の例ですが、C# も場合も同様に、

  • PointerPressed
  • PointerReleased
  • Tapped

などがあります。

Pointer が付いているものは、マウス、指、スタイラスを一括で扱うイベントです。ボタンクリックにあたるものは Tapped イベントを使えばOKです。ボタンコントロール自体には、Click イベントがあります。

private void buttonClearClick(object sender, RoutedEventArgs e)
{
    listMessage.Items.Clear();
}

private void rectPointerPressed(object sender, PointerEventArgs e)
{
    listMessage.Items.Add("pointer pressed");

}

private void rectPointerReleased(object sender, PointerEventArgs e)
{
    listMessage.Items.Add("pointer released");

}

private void rectTapped(object sender, TappedRoutedEventArgs e)
{
    listMessage.Items.Add("pointer tapped");

}

WPF アプリの場合は、ボタンをダブルクリックすると自動的にイベントを作ってくれますが、metro の場合はイベント名を入れないといけません。どっちがいいのか微妙なのですが、WPF に合わせて欲しいなと思っています。

ちなみに、iPhone を作成する XCode の場合には、イベント名は自分で付ける方式です。なので、どちらが「良い」とも限りません。慣習ってところです。

ってな訳で、WPF アプリを作っていたからといって、スムースに metro アプリに移行できるかというと違う訳で、優位性としては、

  • xaml を知っている方が有利(win form だと出てこないので)。なので、silverlight を触っている人もokかと。

ってところですが、

  • でも、イベント関係が違うので、思い込むと迷走するかも。

という落とし穴があります。

なので「指でタッチしてスムースに動く」アプリケーションを作る場合には、デスクトップPCでシミュレーションだけでなく、実機が必須な予感がしています(なので、買ったというもある)。

ちょっと、長くなったので、一旦切ります。実際にソフトキーボードを作るノウハウは、別の記事にでも。

カテゴリー: 開発, C#, windows 8 | 3件のコメント

windows 8 cp でリモートデバッグを有効にする

acer w500 に visual studio 11 beta を入れるのは辛いし、cpu が 1GHz ではプログラミングは辛いので、リモートデバッグで動かすようにします。

方法としては2種類あって、

  • 空きデスクトップPCにwin8+vs11をインストールして、acerへリモートデバッグ
  • VMwareにwin8+vs11をインストールして、acerへリモートデバッグ

という方法があります。試しに両方の環境を用意してみて、どちらがやりやすいかなと。手元の空きPCがないので、Vaio Type-S に win8+vs11 を入れてあります。vs11での開発自体は、メインPCからリモートデスクトップを使うので、ネットワーク的には

メインPC -> VMWare or Type-S -> acer

という具合になりますね。

方法 : リモート デバッグをセットアップする
http://msdn.microsoft.com/ja-jp/library/bt727f1t.aspx

リモートデバッグ自体は、上記のURLを参考にしてDVDから入れます。共有フォルダから直接起動もできるようなのですが、今回は acer にリモートデバッグを入れるて試すということで。

image

実は、Visual Studio 11 beta の DVD の場合、フォルダ名が変わっていて「Remote Tools」になっています。ここで「rtools_setup_x86」を実行すればOK。

image

こんな風にインストールされていきます。

スタート画面に「Remote Debugger」がありますね。

image

実行すると、リモートデバッグモニターが表示されます。アイコン化してバックグラウンドで動かすことも可能です。終了するときは、タスクバーのインジケーターのところで終了させればokです。

image

これで準備はできたので、適当なmetroアプリを作って動かしてみます。

■別のwin8マシンで、vs11からリモートで実行する

あらかじめvs11で用意されているテンプレートを使って、デバッグ実行する時に「リモートコンピューター」に変更します。

image

初回は、次のように開発者ライセンスを設定待ちのダイアログがでます。

image

acer 側では、こんな風に同意待ちですね。Visual Studio 11 beta をインストールした時と同じように、Windows Live アカウト(Microsoft アカウント)を入力します。

image

これでうまく行くはずなんですが、下記なる謎のエラーが出て起動できません。

image

…と思ったら、ビルドターゲットが「x64」を変更したままでした。この開発マシンは win8 64bit版が入っていて、acer は 32bit版なんですよね。プラットフォーム ターゲットを「Any CPU」に変えればOKです。

リモートコンピュータを選択すると、アタッチ先のコンピュータ名を選択します。

デバッグを実行するとこんな具合に、実機(acer)と、メインPC間でデバッグができます。

__

実機なので、スライドの動作も楽だし、実機ならではの動作確認が可能ですね。シミュレータをマウスで使っていると、やっぱり違った感覚になるので、実機は必須かと思います。

デバッグなので、ブレークポイントも使えます。

image

今回は、開発PC(実際は、Vaio Type-S をリモートデスクトップ接続)から実機(acer)を制御したのですが、VMWare上にあるwin8+vs11を使っても同様のことができるかと。windows 8 自体がまだ発売されていないのと、メインの開発機のOSを入れ替えるのは躊躇してしまう(というか入れてはいけない)ので、サブマシンが必須。暫くは、こういう暫定のwin8開発マシンを用意しておいて、メイン開発マシンとの併用になるかと。

カテゴリー: 開発, windows 8 | 1件のコメント

[win8] Acer w500 に windows 8 cp をクリーンインストール(続き)

結論から言うと、windows 8 のクリーンインストールは手間が掛かるので、windows 7 からのアップデートがお勧めです。少なくとも、acer w500 の場合はそうですね。

何が面倒なのかを列記しておくと。

  • SSD アクセスの AHCI モードを IDE モードに変更しないといけない。
  • → customer preview 版だと「msahci」というレジストリがないので、設定できない。

    → win7 からアップデートした場合は、出荷時の AHCI モードで接続できます。

  • 加速度センサー等のドライバーを手動でインストールする必要がある。
  • → 後で書きますが、32bit版を逐次インストールしないとうまく動きません。

  • SDメモリが必要からインストールする
  • → USB/SDメモリからインストールできるのは便利ですが、win7 からのアップデートの場合は、リモートデスクトップでファイルをコピーすれば ok なのです。

と、一応復活はしたので結果オーライなんですが、仕事で使う場合には安全策を取ったほうがベターかと。

■各種ドライバー

ドライバーは以下なところでダウンロードができます。ただし、ここでダウンロードができるのは32bit版(x86)なので、windows 8 cp をインストールする時も、x86 のほうをインストールしなければいけません。

Acer Support: Downloads & Support Documents – Tablet / ICONIA TAB / W500P
http://support.acer.com/us/en/product/default.aspx?tab=1&modelId=3854
日本エイサーサポート|ICONIA TAB W500
http://www2.acer.co.jp/support/products/tablet/iconia_tab_w500.html

英語版でも日本語版でも中身は一緒みたいです。

現在インストールしたのは以下のものです。

  • Application_Dritek_1.01.3002_W7x86_A.zip(アプリケーション→Device Control)
  • Application_Dritek_1.04.1106_W7x86_A.zip(アプリケーション→Auto Screen Rotation Blocker)
  • Bluetooth_Atheros_7.4.0.115_W7x86_A.zip
  • Camera_Cyberlink_1.1.1421_W7x86_A.zip(アプリケーション→WebCam アプリケーション)
  • G Sensor_Bosch_1.0.0.5_W7x86_A.zip

傾きセンサーは、「G Sensor ドライバー」と「Auto Screen Rotation Blocker」で認識させました。「Device Control」」だけでは動きませんでした。
カメラはドライバーではなくて、「WebCam アプリケーション」を入れることで認識されます。

Windows 8 cp をインストールするだけで実行できたのは

  • タッチパネル
  • USB キーボード
  • 無線LAN

です。

■win8 cpで動作確認

画面を回転させたときに、一度画面が真っ黒(ブラックアウト)になるのはインターフェース上なんとかならないかなぁ、と思いますね。iPhone/iPad の場合は、画面をキャプチャしてから廻しているようです。Android の場合はどうなんでしょう?微妙な感じがしますが、画像の回転はしているようです。

タブレットPC操作方法『回転』 ICONIA TAB A500 アンドロイド – YouTube
http://www.youtube.com/watch?v=HcUaK6WXnqQ

デスクトップPC(据え置きのPC)の場合は、画面を回転させることなんて滅多にないというか「無い」ので大丈夫なんですが、スレートPCの場合は使い方によって回転させるのが普通ですからね。

結果的に動画は標準の「ビデオ」で綺麗に表示させることができました。前回、win7 の上書きしたときには動作がおかしかったのですが、綺麗に動くようになった理由はわかりません。ビデオドライバー関係の競合なのかは不明です。無線LANで描画させていますが、全然問題なく動きます。まぁ、ファイル転送を無線LANでやりながら、動画も無線LANとかやると無理そうな気がしますが。あとリモートデスクトップとか。

ビデオ自体は 60MB ほどしかメモリを取っていません。People の metro アプリも 40MB なので小さいほうです。このあたり、win7 で WPF アプリを動かす時と容量が…変わっていないですね orz
ワードパッドが 6MB ぐらいなので、ちょっとしたアプリでも結構なメモリを喰いそうです。

■ソフトウェアキーボード

iPad の場合もそうなのですが、ソフトウェアキーボードを表示させると、画面の半分を占有してしまいます。

これはワードパッドでソフトウェアキーボードを使っているところなのですが、最初の3行ぐらいしか表示されません。ええ、何時の時代のワープロですか?(古い方は知っていると思うのですが、30年程前は、1行液晶のワープロ専用機があったのです)って感じです。
本格的に打ち込むならば、ハードウェアキーボードをUSBかBluetoothで、というのが筋なんですが、ちょっとしたメモを書くにもこんな状態というのはなんとかならないかなぁと、常々思っています。

縦置きにしたときのソフトウェアキーボードの配置は良い感じなんですが、キーの幅が狭いのがなんとも窮屈な感じなのです。分離キーボードを親指で打つ方法もあるんですが、これもいまいち(スレートPCの重量が重いというのもあるけど)。
Excel や Word を編集するときには、もう少し metro っぽいインターフェースを考えないといけませんね。

カテゴリー: windows 8 | 5件のコメント

Acer w500 に windows 8 cp をクリーンインストール

Acer iconia tab W500 に Windows8(Consumer Preview) – sugasaki
http://d.hatena.ne.jp/sugasaki/20120301/1330610296

あたりを参考にして、acer w500 に windows 8 cp のクリーンインストールが完了。

image

win8 cp の 64bit 版が入っています…が、64bit 版はスレートPCの傾き検出のドライバーが効いていない(無い?)らしく、本体を傾けても縦横が変わりません orz 後で、32bit 版を入れ直します。

image

クリーンインストールでハマるのは、

  • あらかじめ「shutdown /s /f /t 0」で、完全にシャットダウンする。
  • 「電源」+「Windowsキー」の同時押し、F2 で bios を開く。
    F12 Boot Menu を有効(Enable)にしておく。
  • 「電源」+「Windowsキー」の同時押し、F12で起動メディアを選択(win8 をインストールする時は、USB/SDメモリを指定するので)
  • HDD アクセスを BIOS で IDE モードに変更する。

「AHCI Mode」だとwin8 cp のインストーラーにドライバーが入っていないらしく、SSDを認識しません。若干遅くなるみたいですが、IDE Mode で認識させます。

# 後から、AHCI に変えられると思うのですが、変更すると「修復」が始まってしまってうまくいかない模様

__

起動メディアは、F12 で選択ができます(なので起動順序はそのままでもOK)。Generic-Multi-Card が、USBメモリになります。SDカードを差しこんでも同じ名前になります。

__

素の環境で、11GB ほど消費しています。残り 18GB なので、VS11(約8GB)を入れても大丈夫かなという感じです。ただし、cpu が 1GHz ほどしかないので、結構 VS11 の動作がもっさりします。metro アプリ自体はきびきび動くんですけどね。多分、metro アプリが軽く作られているんでしょう。

image

試しに Microsoft Office 2010 を入れてみる予定です。

カテゴリー: 雑談 | 5件のコメント

VAIO Type-T に windows 8 customer preview を入れる

持ち運びとしては十分なのだが、開発には足りないので白 type s に席を譲った type t ですが、実は

  • CPU は 1.6 GHz で実は64bit
  • メモリは 2GB 積んである
  • HDD は 80GB でちょっと足りないが、acer よりも多い。

image

ってことで、再インストールした windows 7 をつぶして、windows 8 の 64bit 版を入れてみました。タッチパネルの実験機としては acer を使うのですが、開発機としては type t を使ってみるということで。

メモリが 2GB しかないので、64 bit 版を入れる意味はあまりないのですが、まあ、実験ということで。アプリとしては、

  • Visual Studio 11 beta
  • Office 2010

を入れて試す予定です。

カテゴリー: windows 8 | VAIO Type-T に windows 8 customer preview を入れる はコメントを受け付けていません

Windows Server 8 で IE セキュリティ強化を無効にする

Windows Server 2008 R2 の時もそうだったのですが、サーバー機からインターネットを表示しようとすると「セキュリティ強化」に引っ掛かります。特に、IIS から Web Platform Installer を使って CMS などをインストールしようとすると、サイトがうまく表示されません。

image

こんな感じの画面がでます。

image

で、「セキュリティ強化」を無効にするのですが、これをよく忘れるのでメモ。

Windows Server 8 beta では、サーバーマネージャーの「ローカルサーバー」→「プロパティ」→「IE セキュリティ強化の構成」で変更します。

image

ひとまず、Administrators グループを off にします。

image

ただし、これを実機で off にしてしまうと、思わぬものをインストールされてしまう可能性が出てくるので、何かと権限の多い Administrators では off にしたくはないのですが….先に書いた通り、Web Platform Installer を使ったり、ファイルをダウンロードしたりするときには必須なんですよね。Linux 関係だと、別のサーバーでファイルをダウンロードしてから FTP でアップして、という手順を踏むのですが、Windows Server の場合はどうやっているのでしょうね?社内サーバーだったりすると、直接は外部のインターネットにつながないように配置したりするので、それはそれで良いのですが。Web Platform Installer(Web PI)が使えないと非常に手間だというジレンマが。

対処としては、一時的に off にして Web PI をインストール。再び、on にした状態で、Web PI を使うのがよいのですかね?

ちなみに、Windows Platform Installer 3.0 は、.NET Framework 2.0 でできているので、これをインストールしないといけない。初期状態では、Windows Server 8 は .NET Framework 2.0 を持っていないんですよね。これは、サーバーマネージャを使わないとインストールできないので、試行錯誤が必要という為体。

image

.NET Framework 3.5(.NET 2.0を含む)ってのをインストールすると、無事 Windows Platform Installer がインストールできて、起動できます。スポットライトには Umbraco 5 が載ってますね。

image

左上の検索ボックスに「wordpress」と入れてリターンキーを押すと、WordPress 日本語版もインストールできます。

カテゴリー: 開発, windows 8 | Windows Server 8 で IE セキュリティ強化を無効にする はコメントを受け付けていません

Windows Server 8 beta を試す

Windows Server "8" ベータ版 | Windows Server の次期バージョン
http://www.microsoft.com/ja-jp/server-cloud/windows-server/v8-default.aspx

Windows Server 2008 R2 の次期バージョンということで、インターフェースが Windows 8 タイプになっています。さっくりと vmware にインストールして起動します。vmware を使う時は、ホストコンピュータ(vmwareを動かしている元のコンピュータ)が Intel VT をサポートしている必要があります。

image

ログイン画面は、Windows 8 と同じ感じ…ですが、スライドしてではなくて、おなじみの Ctrl+Alt+Del キーでログインします。

■ログイン直後

image

■サーバーマネージャー

image

左下にマウスをポイントすると、メニューがでてきます。

image

■スタート画面

image

Windows キーでも、スタート画面に移れるのは Windows 8 と同じです。

IE を開くと、デスクトップ版の IE を開きます。metro 版の IE はあるのかどうかは不明です。同じく metro アプリが動くのかどうかも不明。

image

■power shell を使う

メニューには、コマンドプロンプトがないので、power shell を使うみたいです。

image

.NET Framework は 4.0 までが入っています。4.5 がないので、metro アプリは動かないかと。あと、非同期関数も駄目?

image

■役割(Web サーバー)を入れてみる。

役割のインストールは、結構スムースにいきます。2008 と同じ感じですね。

image

機能を見ると、「4.5」はインストール済みみたいですね。逆に「3.5」は、後から入れないと駄目みたいです。3.5 をインストールしないと、ASP.NET MVC 関係が動かないかも。

image

アプリケーション開発で、ASP.NET 4.5 をチェックしないと、ASP.NET アプリが動きません。最初は、3.5 と 4.5 の両方をチェックすることになるでしょう。2.0 がないので動かないかも(以前の ASP.NET は 2.0 ベースだったので)。

レガシー ASP もばっちり残ってますね。拡張子が .aspx ではなくて .asp の VBScript で書くやつです。

PHP を動かす場合は、CGI と ISAPI 拡張が必要だったはずです(後で調べます)。

image

ASP.NET 3.5 をクリックすると、下記のように必要な機能も追加してくれます。このあたりは 2008 R2 と同じですね。

image

IIS 6 管理互換も残っているので、以前作った VBScript も動きます。

image

こんな感じにインストール中。が、エラーが出て止まります。

image

どうやら、「Administrator」じゃないと動かないみたいなので、Administrator で入り直します(Administrators グループでは駄目?)。

無事、スタート画面に IIS マネージャが追加されます。

image

IIS マネージャは以前と同じで、おなじみの構成。

image

ただし、IIS のバージョンは 8 になっているので、何かが違うかも(ASP.NET 4.5 が入っているということで)

image

カテゴリー: windows 8 | Windows Server 8 beta を試す はコメントを受け付けていません

acerのSDHCメモリにVS11betaをインストールする

acer w500には、SDメモリを差し込むところがあります。これがDドライブになるのですが、win8をインストールした後、ディスククリーンアップでwindows.old フォルダを消して、残り容量は 13 GB になります。

image

Visual Studio 11 beta 自体は、8 GB 位占有するので、残りは 5GB 程度。実験的に開発するにはいいかもしれませんが、ちょっと音楽ファイルなり動画なりを入れようとするとすぐに溢れそうです。また、先行き MS-Officeを入れることを考えると、もうちょっとなんとかしたい。

というわけで、先日書いた通り、SDHC メモリ 32 GB を買ってきました。このメモリを差し込んで、D ドライブに VS11beta を入れれば OK … と思ったのですが、Visual Studio のインストール先は「リムーバブルディスク」では駄目だそうです。うーむ、どうしたものかと思ったのですが、ここは「DドライブをCドライブのフォルダにマウントすれば?」と思って調べてみました。

Windowsでフォルダをドライブに見せる&ドライブをフォルダに見せる。 – ..たれろぐ..
http://d.hatena.ne.jp/naga_sawa/20110105/1294223413

なところに、mountvol コマンドの使い方があります。

私の場合は、

C:\>mountvol c:\opt \\?\Volume{388c1909-76fa-11e1-8e17-90baa38d700f}\

な風に「c:\opt」フォルダに D ドライブをマウントしてしました。そして、opt フォルダ内に「Program Files」フォルダを作っておきます。

このフォルダを作っておくと、D ドライブそのもので使うときも ok だし、C ドライブにマウントする時も ok という便利な方法です(実際は、内部で 「c:\opt\Program Files\…」のフォルダ名を持っていることがあるので、マウントは必須なんですが、見かけ上)。

C:\opt>dir \opt
ドライブ C のボリューム ラベルは Acer です
ボリューム シリアル番号は F4B0-6C2E です

C:\opt のディレクトリ

2012/03/29  01:48    <DIR>          iso
2012/03/29  01:55    <DIR>          Program Files
               0 個のファイル                   0 バイト
               2 個のディレクトリ  28,716,089,344 バイトの空き領域

これで、インストールをすると順調にインストールされます。

image

C:\opt\Program Files\Microsoft Visual Studio 11.0 の中身(実際は、D:\Program Files\Microsoft Visual Studio 11.0)も順調に増えているので、C ドライブの HDD を圧迫していないことが分かります。まあ、実際は、C:\Windows\Microsoft.NET\Framework の中に各種アセンブリが放り込まれるので完全に追い出しているとは言えませんが、Visual Studio の開発関連は追い出せているはずです。

image

ちなみに、インストール自体はリモートデスクトップを使っています。ソフトウェアキーボードでは辛いし、ハードウェアキーボードを付けてもいいけど、マウスとワンセットでないと駄目だし、ということで画面のキャプチャも取り易いのでリモートデスクトップでインストールするのがお勧めです。多分、開発自体もリモートデスクトップですね。

結果的にどれくらいになったかというと、C ドライブの残りは 8GB になりました。SDHC メモリの Program Files の下を調べると 3GB 位追い出せています。

image

ただし、VMWare にインストールするのと違って、ひどく時間がかかります(1時間半ほどインストールしていたと思う)。まあ、インストール自体は最初だけなので、後はどれだけ開発ができるか、実機テストが楽になるか、というところですね。このあたりは後日。

カテゴリー: 開発, windows 8 | acerのSDHCメモリにVS11betaをインストールする はコメントを受け付けていません