差分
[[Mac OS X]]に対して[[キーボード]]の入力をシミュレートしたい。
これが出来ると[[仮想キーボード]]や[[ショートカットキー]]を発射するアプリ、[[バーコードリーダー]]みたいなものなど夢が広がる。
個人的にはアプリに対して外部から通信があった際に[[スクリーンセーバー]]を解除するのに用いた。
==実装1==
[[Mac OS X]]の標準ライブラリのひとつである[[CoreGraphics]]に各種イベントを送信するクラスが用意されている。
なぜこの手のクラスが[[CoreFoundation]]ではなく[[CoreGraphics]]にあるのかは謎である。[[三角形の秘密]]や[[プチエンジェル事件]]並みに闇は深い。
なお、ここで使われる[[キーコード]]は[[Mac]]独自のものであり、[[Windows]]で一般的な[[キーコード]]とはまったく別物である点に注意すること。[[キーコード]]の一覧などの詳細は「[[キーコード/Mac OS X]]」を参照。
また、本物の[[キーボード]]の[[Caps Lock]]の状態は無視されるので、大文字を送信する場合は「CGEventFlags.Shift」を立てる。
<source lang="csharp">
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)
{
var source = new CGEventSource(CGEventSourceStateID.CombinedSession);
var keydown = new CGEvent(source, keycode, keyDown: true);
keydown.Flags = modifiers;
var keyup = new CGEvent(source, keycode, keyDown: false);
CGEvent.Post(keydown, CGEventTapLocation.AnnotatedSession);
CGEvent.Post(keyup , CGEventTapLocation.AnnotatedSession);
}
}
}
</source>
個人的に[[スクリーンセーバー]]を解除するのには送信しても他のアプリに影響の少ないであろう右矢印キーを用いた。
<source lang="csharp">
PostKeyWithModifiers(123); // →矢印;
</source>
==関連項目==
*[[Xamarin.Mac/ディスプレイのスリープを解除する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]
これが出来ると[[仮想キーボード]]や[[ショートカットキー]]を発射するアプリ、[[バーコードリーダー]]みたいなものなど夢が広がる。
個人的にはアプリに対して外部から通信があった際に[[スクリーンセーバー]]を解除するのに用いた。
==実装1==
[[Mac OS X]]の標準ライブラリのひとつである[[CoreGraphics]]に各種イベントを送信するクラスが用意されている。
なぜこの手のクラスが[[CoreFoundation]]ではなく[[CoreGraphics]]にあるのかは謎である。[[三角形の秘密]]や[[プチエンジェル事件]]並みに闇は深い。
なお、ここで使われる[[キーコード]]は[[Mac]]独自のものであり、[[Windows]]で一般的な[[キーコード]]とはまったく別物である点に注意すること。[[キーコード]]の一覧などの詳細は「[[キーコード/Mac OS X]]」を参照。
また、本物の[[キーボード]]の[[Caps Lock]]の状態は無視されるので、大文字を送信する場合は「CGEventFlags.Shift」を立てる。
<source lang="csharp">
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)
{
var source = new CGEventSource(CGEventSourceStateID.CombinedSession);
var keydown = new CGEvent(source, keycode, keyDown: true);
keydown.Flags = modifiers;
var keyup = new CGEvent(source, keycode, keyDown: false);
CGEvent.Post(keydown, CGEventTapLocation.AnnotatedSession);
CGEvent.Post(keyup , CGEventTapLocation.AnnotatedSession);
}
}
}
</source>
個人的に[[スクリーンセーバー]]を解除するのには送信しても他のアプリに影響の少ないであろう右矢印キーを用いた。
<source lang="csharp">
PostKeyWithModifiers(123); // →矢印;
</source>
==関連項目==
*[[Xamarin.Mac/ディスプレイのスリープを解除する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]