たぶん、ポケットにマウスを入れる必要のあるトリッキーなプレゼンテーションをしたいですか?
OK、カットが必要です(写真があります)。
最終製品にのみ興味があり、技術的な詳細には興味がない場合は、よくある質問のセクションに進んでください。
コンセプト
タスク:WMコミュニケーターを完全なタッチパッドとキーボードに変えながら、その助けを借りてwinシステムを制御できるようにします。
一般に、管理対象システムが勝つことはないかもしれませんが、それについては以下で詳しく説明します。
UDP / IP over Wi-Fiをトランスポート、または(目利きの人には)Bluetoothとして使用します。
これに必要なもの:
- デバイスのデフォルトのキーボードから入力をキャプチャします。
- コミュニケーターのタッチスクリーンを使用してエミュレートします:
- 通常のタッチパッド、スクロールとクリック。
- マウスホイール;
- マウスボタン(ドラッグアンドドロップのクランプクリックでカーソルを移動する機能);
- デバイスから受信したデータをキーボードおよびマウスストリームに書き込むことができる管理対象システム(サーバー)上のアプリケーション。
- 管理対象システム上のサーバーとクライアントアプリケーションを交換するためのプロトコル。
WMの申請
C#の .NET Compact Framework 3.5用に作成され、 WM 6.5を使用したHTC HD2でテスト済み。
クライアントアプリケーションはベンダー固有のAPIを使用しないため、WM 5および6のすべてのデバイスで動作するはずです。
キーボードとタッチスクリーンの入力をキャプチャする原理は非常に簡単です。
- 何らかのコントロールを作成し、ウィンドウに合わせてストレッチします(Dock = Fill)。
- 私たちは彼に注目しました。
- KeyDown、KeyUp、KeyPressイベントをサブスクライブして、キーストロークをインターセプトします。
- タッチパッドをエミュレートするMouseDown、MouseUp、MouseMove。
タッチパッド
タッチパッドのエミュレーションの原理が表現されている用語について少し説明します-以下の説明で使用されます:
- 静的移動-ユーザーがタッチパッドの境界に指をドラッグしてそこに置いた場合、制御されたカーソルはその境界に向かってゆっくりと移動します。 固定クリックでカーソルをドラッグするのに便利。
- スクロール-ユーザーは、タッチパッドの端にある特別な領域に指を走らせました。これは、ホイールのスクロールと解釈されます。
- スクロールパッドは、タッチパッドの端にある上記の「特別な領域」です。 指が動き始めたらスクロールがオンになり、そうでなければ通常のタッチパッドのように機能します。
- 慣性スクロール-ユーザーはスクロールを有効にし、動きを止めることなく指を離しました。 ユーザーがタッチパッドに再び触れることができるようになるまで、ユーザーの介入なしにスクロールが同じ速度でさらに実行されます。
- クリックしてドラッグ-クリックし、指を離し、すぐにもう一度クリックします-クリックしてカーソルを操作できます。
ConfigApplyとConfigStoreは直接関係ありません。 MouseHandlerのすべての動作は、イベントの処理に帰着します。イベントの目的は一般的に名前から明らかです。
キーボード
デバイスは簡単です:
イベント:
- OnKeyCommand-制御文字( これらのいずれか)を受け取りました。 一般に、それらは標準化されています。
- OnKeyUnicode-印刷可能な文字を受け取りました。 K.O. ユニコードでそのことに気づきます。
お客様
サーバーに送信するための制御メッセージを生成することをタスクとするクラス:
タイプKeyboardCommand()、MouseMove()などのメソッドを介して、要求されたアクションを受け取ります。 メッセージを作成し、OnPacketSendイベントを介してソケットに送信します。
構成
ユーザーには、基本的なXML形式で構成を編集するユニークな機会が与えられます。
アプリケーションがどのように実装されているか、彼らと連携します。興味がある人は自分で確かめてください。 私はそれについて話したくありません。
画面:
configsのメインフィールドの目的は、名前から明らかではありません。
- buttonRightClickHold-右クリックロックボタンを表示します。 つまり 押すと、もう一度クリックするまで右クリックが続きます。 デフォルトでは、ボタンは表示されません。
- buttonSettings-laconic configエディターを呼び出すためのボタンを表示します。スクリーンショットは上にあります。 デフォルトでは、このボタンは何らかの理由でオンになっています。
- clickAndDragDelay-タッチパッドを再度クリックしてクリックアンドドラッグ(上記の説明)を取得する必要がある時間。
- locationUpdateInterval-カーソル位置を更新する間隔(ミリ秒単位)。
- staticSpeed-静的移動の速度、パケットごとのピクセル。
- staticBoundsRelative-静的移動がアクティブ化されるフィールドの境界。 ウィンドウ全体のサイズに関連して設定されます。
- scrollInMousePixels-スクロールパッドの感度。 数値が小さいほど、感度が高くなります。
インターフェース
インターフェースを描くとき、私はカジミール・マレーヴィッチの人気の絵画に触発されました。
GUIは自己文書化ユーザーインターフェイスであると見なされるため、ボタンシグネチャ(左側の画面)を残しました。これは、タッチパッド(右側の画面)の最初のタッチ後に消えます。
はい、まだ言っていません。画面上のこの黒いフィールドはタッチパッドです。 ボタンの目的は、名前から明らかです。 キーボードを使用しても問題は発生しません。
ウィンドウの縦向きは、タッチパッドの画面領域を保存するために使用されます。 一方、タッチパッド自体の使用は横向きであると想定されています(ただし、これはカスタマイズ可能です)。
サーバー
pythonとSendKeysを使用して多かれ少なかれクロスプラットフォームサーバーを作成する最初の試みは失敗しました。SendKeysはUnicodeを認識しないことが判明したためです。 マウスでpythonを操作する方法、私も見ていませんでした。
2番目の試み(成功)は、CのコンソールアプリケーションからWinAPIを使用することでした。この場合、マウスおよびキーボードストリームにコマンドを書き込む作業は、 SendInput関数を使用して実行されます。
UDPソケットをリッスンし、SendInput()を定期的に呼び出す単純なコンソールアプリケーションは、考慮する価値がありません。 システムリソースを実質的に消費しない(特にクライアントが切断されている場合)ので、常に実行し続けることができます。
移植性に関しては、管理しやすいシステムにコマンドを配信するために実装が簡単な実装が使用されるため、他のプラットフォーム用のプラットフォーム固有のアプリケーションを作成することは難しくありません(視聴者はそれを必要とします)。
プロトコル
データはクライアントからサーバーにのみ送信され、確認または逆コマンドは提供されません。
コマンドは、次のフィールドで構成される固定サイズのフレームで送信されます。
- ヘッダー-3バイト、文字列「d2k」
- パケットのシリアル番号(ブロードキャスト時のパケットの再試行を避けるため、デフォルトで使用されます)-1バイト
- コマンドのタイプ(制御文字、ユニコード文字、マウスの移動など)-1バイト
- コマンドデータ(カーソル座標、文字コードなど)-4バイト、リトルエンディアン
よくある質問
Q: OK、Device2Keyboardを使用したいです。 これには何をする必要がありますか?
A:投稿の最後にあるリンクを使用してクライアントアプリケーションとサーバーアプリケーションをダウンロードし、起動します。 デフォルトのサーバーアドレスはクライアントの255.255.255.255:12358(ブロードキャストIPアドレス)であるため、デフォルト設定では、コミュニケーターとサーバーが同じサブネット上にある必要があると想定しています。 すべてがそのまま使用でき、追加の設定は必要ありません。
Q:ワイヤレスインターフェイスを使用したくありません。 になる方法
A: ActiveSyncがインストールされた管理対象PCにデバイスを接続し、クライアントのデフォルト設定のままにします。 すべてが機能します。
Q: Drag'n'Dropの実行中にクリックを修正しましたが、サーバーへの接続が中断され、クリックは固定されたままになりました。 どうする
A: 3秒待ちます。 この間にサーバーがクライアントからマウスクリックの状態を設定するコマンドを受信しない場合、保持されているすべてのボタンを解放します。
Q:マウスカーソルを長時間移動すると、トラフィックが多いためにネットワークが落ちますよね?
A:カーソル位置を更新するためのデフォルトの頻度は10ms(100回/秒)です。 パケットサイズ(3 + 1 + 1 + 4)== 9バイト、+ UDP / IPフレームオーバーヘッド28バイト、1メッセージで37バイト、つまり3.6 kbit / sになります。 マウスが動かない場合、その位置は更新されません。 答えはノーです。
おわりに
WMおよびデスクトップ用のアプリケーション、インストールには必要ありません: dl.dropbox.com/u/3815390/dev2kbd/bin/bin.7z
ソース: dl.dropbox.com/u/3815390/dev2kbd/src/src.7z
アプリケーションとそのソースは、 WTFPLライセンスの下で配布されます。
タイトルからの写真、ソース: migdal-or.livejournal.com/55703.html