本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
それでは私のセッションを始めたいと思います。
金子と申します。富山や東京で主にIT企業を経営しております。2012年にMicrosoft MVPをリモートデスクトップサービスというカテゴリで受賞しました。今は、Microsoft MVPリコネクトに参加しております。
Windows版のリモートデスクトップ「Brynhildr(ブリュンヒルデ)」というアプリをIchiGekiというハンドルで開発しております。アプリはWindowsで作られているのですが、言語はC言語を使っているということで、Windows開発とC言語の2つのTechFeedエキスパートに参加しております。
リモートデスクトップに”らくがき”が... !?
皆さんご存知だと思いますが、リモートデスクトップとはどういったものかというと、操作する側のPCから、操作される側のPCを遠隔操作するものです。画面を見ながらマウスやキーボードで操作するのですが、この画面ではログイン画面を遠隔操作しています。
らくがきが気になりますよね。緑の顔と赤の顔が書いてありまして、ログイン画面なのにどうしてこういうことができるのかということを、ご説明したいと思います。
Windowsサービスの起動と使用するAPI
では「1分でわかる別のPCのログイン画面に『らくがき』するポイント」ということでお話ししたいと思います。
主にAPIを中心にお話ししたいと思います。まず1つめ、ログイン画面で遠隔操作するには、普通のプロセスだと止まってしまいますので、Windowsサービスを起動させないとそもそも起動ができません。ですので、CreateServiceというAPIを使ってまずはプロセスをサービス化させます。
2つめですが、ログイン画面にアクセスできる権限のプロセスを起動させます。Windowsサービスというのは、実際に画面にアクセスすることはできないんですね。なので、システム権限というログインユーザーよりも強い権限を持ったプロセスを起動する必要があります。システム権限で起動しているプロセスのトークンを、OpenProcessTokenというAPIを使って取得して、同じ権限を持つCreateProcessで、同じ権限を持つプロセスを起動します。これで画面のキャプチャができるようになるので、キャプチャしてクライアント側に送信するという形で作ります。
3つ目にらくがきです。普通だと四角いウィンドウになるので、描画用のウィンドウを生成する際にはCreateWindowExとWS_EX_TOOLWINDOW、WS_POPUPで透明なウィンドウを作ります。
4つ目ですが、透明なウィンドウを半透明化します。蛍光ペンのような緑のペンと赤いペンがあるのですが、これらは実は半透明になっています。ペンを半透明にするのに加えて、らくがき以外の部分を透明化しないと四角になってしまいますので、これを実現するためにSetLayerWindowAttributesというAPIを使います。
この4つが大事なポイントというか、私がはまったポイントだったので、これがあれば「ログイン画面に落書きできるリモートデスクトップ」を開発できると考えています。駆け足でしたが、この4つが大事だと思ってご説明しました。
リモートデスクトップでは”速さ”が正義!
おまけで、「リモートデスクトップは速さが正義」です。とにかく速くなければいけません。圧縮、通信、キャプチャ、描画などマルチスレッドによる並列処理でいつも高速化しています。そのときに、beginthreadやbeginthreadexを使い分けて、うまく並列処理をして、並列処理をいかに効率の良い形に組めるかがカギかなと思っております。
さらに、より速度を求められるRGB32からYUV420に変換する処理というのは、実はC言語ではなくアセンブラで書いています。1秒間に何億回も演算しないといけないので、Cで書くよりもアセンブラのほうがかなり速いんです。ですので、そもそもC/C++にすらこだわっておらず、目的が達成できるのであれば手段を選ばないというスタイルのエンジニアをやっております。
そんな感じで今日は駆け足でしたが、説明させていただきました。ご清聴ありがとうございました。