「Xamarin.Mac/キーボードの入力をシミュレートする」の版間の差分
(→実装1) |
(→実装1) |
||
(2人の利用者による、間の3版が非表示) | |||
10行目: | 10行目: | ||
なお、ここで使われる[[キーコード]]は[[Mac]]独自のものであり、[[Windows]]で一般的な[[キーコード]]とはまったく別物である点に注意すること。[[キーコード]]の一覧などの詳細は「[[キーコード/Mac OS X]]」を参照。 | なお、ここで使われる[[キーコード]]は[[Mac]]独自のものであり、[[Windows]]で一般的な[[キーコード]]とはまったく別物である点に注意すること。[[キーコード]]の一覧などの詳細は「[[キーコード/Mac OS X]]」を参照。 | ||
− | + | また、仮想的にキーコードを送信する際は本物の[[キーボード]]の[[Caps Lock]]の状態は無視されるので、大文字を送信する場合は「CGEventFlags.Shift」を立てる。 | |
<source lang="csharp"> | <source lang="csharp"> | ||
54行目: | 54行目: | ||
</source> | </source> | ||
− | 個人的に[[ | + | 個人的に[[Xamarin.Mac/スクリーンセーバーを終了させる|スクリーンセーバーを解除する]]のには送信しても他のアプリに影響の少ないであろう左矢印キーを用いた。 |
<source lang="csharp"> | <source lang="csharp"> | ||
PostKeyWithModifiers(123); // 「←矢印キー」を送信; | PostKeyWithModifiers(123); // 「←矢印キー」を送信; | ||
61行目: | 61行目: | ||
==関連項目== | ==関連項目== | ||
*[[Xamarin.Mac/ディスプレイのスリープを解除する]] | *[[Xamarin.Mac/ディスプレイのスリープを解除する]] | ||
− | + | *[[Xamarin.Mac/スクリーンセーバーを終了させる]] | |
+ | *[[Xamarin.Mac/ウインドウの一覧を取得する]] | ||
==参考文献== | ==参考文献== | ||
{{reflist}} | {{reflist}} |
2016年3月31日 (木) 07:06時点における最新版
Mac OS Xに対してキーボードの入力をシミュレートしたい。
これが出来ると仮想キーボードやショートカットキーを発射するアプリ、バーコードリーダーみたいなものなど夢が広がる。 個人的にはアプリに対して外部から通信があった際にスクリーンセーバーを解除するのに用いた。
実装1編集
Mac OS Xの標準ライブラリのひとつであるCoreGraphicsに各種イベントを送信するクラスが用意されている。 なぜこの手のクラスがCoreFoundationではなくCoreGraphicsにあるのかは謎である。三角形の秘密やプチエンジェル事件並みに闇は深い。
なお、ここで使われるキーコードはMac独自のものであり、Windowsで一般的なキーコードとはまったく別物である点に注意すること。キーコードの一覧などの詳細は「キーコード/Mac OS X」を参照。
また、仮想的にキーコードを送信する際は本物のキーボードのCaps Lockの状態は無視されるので、大文字を送信する場合は「CGEventFlags.Shift」を立てる。
using System;
using AppKit;
using CoreGraphics;
namespace SimKeyboard
{
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
for (int wait = 5; 0 < wait; wait--)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine(wait);
}
PostKeyWithModifiers(0, CGEventFlags.Shift); // A;
PostKeyWithModifiers(1, CGEventFlags.Shift); // S;
PostKeyWithModifiers(2, CGEventFlags.Shift); // D;
PostKeyWithModifiers(3) ; // f;
}
static void PostKeyWithModifiers(ushort keycode, CGEventFlags modifiers = 0)
{
using (var source = new CGEventSource(CGEventSourceStateID.CombinedSession))
using (var keydown = new CGEvent(source, keycode, keyDown: true))
using (var keyup = new CGEvent(source, keycode, keyDown: false))
{
keydown.Flags = modifiers;
// 送信
CGEvent.Post(keydown, CGEventTapLocation.AnnotatedSession);
CGEvent.Post(keyup , CGEventTapLocation.AnnotatedSession);
}
}
}
}
個人的にスクリーンセーバーを解除するのには送信しても他のアプリに影響の少ないであろう左矢印キーを用いた。
PostKeyWithModifiers(123); // 「←矢印キー」を送信;