Apple Wireless Keyboard Helperを使ってApple Wireless KeyboardのキーバインドをWindows向けに書き変える

Apple Wireless Keyboard(JIS版)はMAC向けのキー配置なわけですが、以下のような違いがあるようです。

Apple Wireless Keyboard 一般的なWindows Keyboard
commandキー windowsキー
commandキー+スペースキー 半角・全角漢字キー
deleteキー backspaceキー

これに加えて、

  • ctrlキーとcapslockキーの位置が逆
  • fnキーが使えない

といった違いがあり、前者はWindows環境であえてctrlキーとcapslockキーのキーバインドを逆にして使っていた私としては何も問題にはならなかったのですが、後者は大きな問題でした。しかしながら、既にこの問題に取り組んでくれた方がいるようで、WindowsApple Wireless Keyboardのfnキーを使えるようにするApple Wireless Keyboard Helperというすばらしいツールがあるようです。これを適用することで、

Apple Wireless Keyboard 一般的なWindows Keyboard
英数キー、かなキー 半角・全角漢字キー
fnキー+deleteキー deleteキー
fnキー+F7/F8/F9 iTunesを操作
fnキー+F10/F11/F12 音量を調節
ejectキー ディスク取出

のようにfnキーを活用できるようになりました。なお、このとき、Apple Wireless Keyboard Helperで使用するpythonスクリプトは以下のようになります。

import clr

from System import *
from System.Diagnostics import Process
from System.Runtime.InteropServices import Marshal
from System.Windows.Forms import *
from Misuzilla.Applications.AppleWirelessKeyboardHelper import Program, Util

# Master Volume Control
clr.AddReferenceByPartialName("MasterVolumeControlLibrary")
from MasterVolumeControlLibrary import MasterVolumeControl
volControl = MasterVolumeControl.GetControl()

def OnLoad(sender, e):
  pass

def OnUnload(sender, e):
  volControl.Dispose()

Program.Load   += OnLoad
Program.Unload += OnUnload

"""
Power Button
"""
def OnDown_Power():
  # Lock desktop
  Process.Start("rundll32.exe", "user32.dll,LockWorkStation")

"""
Eject Button
"""
def OnDown_Eject():
  Util.Eject("E");

"""
Alpha Numeric(eisu) (JIS only)
"""
def OnUp_JISAlphaNumeric():
  Util.SendInput(Keys.HanjaMode) # IME on/off

"""
Kana Key (JIS only)
"""
def OnUp_JISKana():
  Util.SendInput(Keys.IMEConvert) # IME Convert

"""
Fn + F1 ... F12 (OnDown_Fn_[KeyName])
"""
def OnDown_Fn_F1():
  pass
# MessageBox.Show('Fn+F1') # System.Windows.Forms.MessageBox

def OnDown_Fn_F2():
  pass
# Program.ShowBalloonTip('Fn+F2') # ShowBalloonTip(str) or ShowBalloonTip(str, System.Windows.Forms.ToolTipIcon)

def OnDown_Fn_F3():
  if Environment.OSVersion.Version.Major >= 6:
    Process.Start("rundll32.exe", "DwmApi #105") # 3D Filp
  else:
    toggleDesktop() # Show Desktops

def OnDown_Fn_F4():
  pass
# Util.SendInput(Keys.PrintScreen) # System.Windows.Forms.Keys

def OnDown_Fn_F5():
  pass

def OnDown_Fn_F6():
  pass

def OnDown_Fn_F7():
  # iTunes / Previous Track
  execiTunes(lambda it: it.PreviousTrack())

def OnDown_Fn_F8():
  # iTunes / PlayPause
  execiTunes(lambda it: it.PlayPause())

def OnDown_Fn_F9():
  # iTunes / PlayPause
  execiTunes(lambda it: it.NextTrack())

def OnDown_Fn_F10():
  volControl.Mute = not volControl.Mute

def OnDown_Fn_F11():
  volControl.VolumeDown()

def OnDown_Fn_F12():
  volControl.VolumeUp()

"""
Fn+BackSpace -> Delete
"""
def OnDown_Fn_Back():
  Util.SendInput(Keys.Delete)

"""
Fn+Delete -> VolumeUp (for F12 replaced by Delete)
"""
def OnDown_Fn_Delete():
  volControl.VolumeUp()

"""
Fn+Up/Down -> PageUp/PageDown
"""
def OnDown_Fn_Up():
  Util.SendInput(Keys.PageUp)

def OnDown_Fn_Down():
  Util.SendInput(Keys.PageDown)

"""
Fn+Left/Right -> Home/End
"""
def OnDown_Fn_Left():
  Util.SendInput(Keys.Home)

def OnDown_Fn_Right():
  Util.SendInput(Keys.End)

# ----

# Create COM Object
def createObject(progID):
  t = Type.GetTypeFromProgID(progID)
  return Activator.CreateInstance(t)

# iTunes Helper functions
def execiTunes(f):
  it = createObject('iTunes.Application')
  f(it)
  Marshal.ReleaseComObject(it)

# Show desktop
def toggleDesktop():
  shell = createObject('Shell.Application')
  shell.ToggleDesktop()
  Marshal.ReleaseComObject(shell)