0

JRuby+jnativehookでMacのキーボード・マウス入力を取得

JRubyでグローバルフックとかグローバルホットキーと呼ばれる、OSの機能を使う。

普通のホットキーはアプリがアクティブの時しかキー入力やマウス入力を取得できないが、jnativehookというjavaのライブラリを使うとアクティブじゃなくても取得できる。


コードはgistに置いた。
global keyhook with JRuby

下の方に書いたけどマウスはちゃんと取れるけどキーボードがshiftとctrlとcommandしか取れず、しかも全部shift扱いになる。
まあ今考えてる用途には十分なので別にいいか・・

jnativehookのインストール

jnativehook – A library to provide global keyboard and mouse listeners for Java. – Google Project Hosting
からJNativeHook-1.1.4.zipをダウンロードして解凍し、JNativeHook.jarをget

Macの場合
/Library/Java/Extensions/
にjarを置けばパスが通る。


アプリケーションにコンピュータの制御を許可する

Macの場合、グローバルフックへのアクセス権限をアプリに許可する必要がある。
システム環境設定から許可するけど、先にプログラムを動かさないとチェックボックスが現れないと思う。


プログラム書く

Ruby好きなのでJRubyで書く。
JRubyの場合includeでjavaのインタフェースをimplementできる。
examplesを参考に、キーボードとマウス両方を取得した。

hook.rb
require 'java'
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import org.jnativehook.mouse.NativeMouseEvent;
import org.jnativehook.mouse.NativeMouseInputListener;

class KeyHook
include NativeKeyListener

def nativeKeyPressed(e)
puts NativeKeyEvent.getKeyText e.getKeyCode
end

def nativeKeyReleased(e)
puts NativeKeyEvent.getKeyText e.getKeyCode
end

def nativeKeyTyped(e)
puts NativeKeyEvent.getKeyText e.getKeyCode
end

end

class MouseHook
include NativeMouseInputListener

def nativeMouseMoved(e)
puts "#{e.getX}, #{e.getY}"
end

end

GlobalScreen.registerNativeHook
GlobalScreen.getInstance.addNativeKeyListener KeyHook.new
GlobalScreen.getInstance.addNativeMouseMotionListener MouseHook.new

loop do
sleep 1
end
すごいすっきり書けた。

なおマウスはクリックなども取れるけど省略した


動かす


% jruby hook.rb



マウスの動きはちゃんと取れた。
キーボード入力がctrlとshiftとcommandしか取れないし、全部shiftになる。
Javaのサンプルでもshiftしか取れないし、同じことをissueで質問してる人がいるのでバグだと思う。

0

Arduino Microをキーボードにする

LeonardとMicroはATmega32U4が使われていて、これがキーボードとマウスとしても認識されてる。
http://arduino.cc/en/Reference/MouseKeyboard

センサー読んで「明るい」「暗い」と書くキーボード

void setup(){
pinMode(13, OUTPUT);
Keyboard.begin();
}

void loop(){
if(analogRead(0) > 100){ // analog 0に明るさセンサ
digitalWrite(13, true);
Keyboard.println("akarui");
}
else{
digitalWrite(13, false);
Keyboard.println("kurai");
}
delay(1000);
}

beginしてprintlnするだけで書ける。とてもかんたん。

0

USキーボード vs JISキーボード

Macの話。どちらの配列も普段から使っているけど、俺はJISの方が好き。

結論としてはおっさんは初めて使ったキーボードがUSなのだろうから、USキーボードに愛着があるんだろうしそのままUS使えばいい。
日本語打たないならUSの方がいいかも。

command+tabでのウィンドウ切り替え

USキーボードではtabの上に~があり、これで逆順に回せる


USは数字キーの真上にF1等のキーがあるので押しやすい

対応する同じ番号のFキーがある


USは英数、かなキーが無いのでcommand+spaceで入力方法を切り替える

モード変換をトグルで切り替えるのは正気の沙汰じゃないですよ、無駄が多い。
keyremap4macbookで左右のcommandそれぞれにその機能を割り当てられるので、USキーボードでも問題ない
でもcommand+wが誤爆する事があって悲しい事になる
ほとんどのアプリはcommand+wに警告を出してくれない


USキーボードは+と-、[と]などが左右に並んでいる

わかりやすい
キーボードショートカットもUSの方が押しやすいアプリが多いらしい?
俺は慣れた


JISキーボードはキーが左に寄っているので、トラックパッドに手が乗ってしまう

最近のMacのトラックパッドは手のひらは検出しないようになってるので問題ない


JISキーボードはキートップに日本語と英語両方印字してあってゴチャゴチャしている

むしろ耳なし芳一っぽくてかわいい、バグが寄ってこなくなりそう


USキーボードの方がspaceキーが大きい

JISでも十分に大きい
spaceキーが大きいと、右commandキーをかなキーに割り振っている時に押しづらい


USキーボードはEnterキーが小さい

ッターンできない


USキーボードは記号が右に集中してて小指が疲れる

全体的に横に長いので小指が仕事しまくってつらい
特に\と|が、JISだと上段なので薬指でいけるんだけど、USでは小指一択になる


JISキーボードは左手小指でcontrolキーを押せるが、USキーボードだとcapslockになっている

Macの環境設定で変更できるのでUSキーボードでも問題ない


昔のMacのJISキーボードはcommandキーが左側にしか無かったらしい

今は左右にある


みんなJISキーボードに慣れてる

おっさんは最初に触ったキーボードがUSなので、US派になる
おっさん以外は、最初に触ったキーボードがJISキーボードのはず
国内メーカーのパソコンも店に並んでるMacもみんなJISキーボード


JISキーボードは右側の記号のキーが小さくて押しづらい

最近はそうでもない
少なくともMacbook Air11インチ、Macbook Pro17インチだと全キー同じサイズになってる
ネットブックとか、昔のノートパソコンとかだと右のほうのキーが露骨に小さかったけど・・