module BlinkenLights
  def self.open
    c, n, s = caps, num, scroll
    yield self
    self.caps, self.num, self.scroll = c, n, s
  end
  private
  def self.add_key(name, code)
    define_method(name) do
      @get_key_state ||= Win32API.new("user32", "GetKeyState", ["i"], "i")
      @get_key_state.call(code) != 0
    end
    define_method("#{name}=") do |on|
      if send(name) ^ on
        @keybd_event ||= Win32API.new("user32", "keybd_event", %w[i i i i], "v")
        @keybd_event.call(code, 0, 0, 0)
        @keybd_event.call(code, 0, 0x26, 0)
      end
    end
    module_function name, "#{name}="
  end
  for name, code in {:caps => 0x14, :num => 0x90, :scroll => 0x91}
    add_key(name, code)
  end
end
