Package org.rzo.yajsw.os.ms.win.w32

Source Code of org.rzo.yajsw.os.ms.win.w32.WindowsXPKeyboard$MyUser32$KeyboardProc

/* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* <p/>
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details. 
*/
package org.rzo.yajsw.os.ms.win.w32;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.collections.MultiHashMap;
import org.rzo.yajsw.os.Keyboard;
import org.rzo.yajsw.os.ms.win.w32.DummyWindow.HotKey;
import org.rzo.yajsw.os.ms.win.w32.DummyWindow.WndListner;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;

// TODO: Auto-generated Javadoc
/**
* The Class WindowsXPKeyboard.
*/
public class WindowsXPKeyboard implements Keyboard
{

  /** The _instance. */
  static Keyboard  _instance;

  /**
   * Instance.
   *
   * @return the keyboard
   */
  static synchronized public Keyboard instance()
  {
    if (_instance == null)
      _instance = new WindowsXPKeyboard();
    return _instance;
  }

  /**
   * The Interface MyUser32.
   */
  public interface MyUser32 extends User32
  {

    /** The INSTANCE. */
    MyUser32  INSTANCE  = (MyUser32) Native.loadLibrary("User32", MyUser32.class);

    /*
     * LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam
     * );
     */
    /**
     * The Interface KeyboardProc.
     */
    interface KeyboardProc extends StdCallCallback
    {

      /**
       * Callback.
       *
       * @param code
       *            the code
       * @param wParam
       *            the w param
       * @param lParam
       *            the l param
       *
       * @return the int
       */
      int callback(int code, int wParam, int lParam);
    }

    /*
     * LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM
     * lParam );
     */
    /**
     * Call next hook ex.
     *
     * @param hhk
     *            the hhk
     * @param nCode
     *            the n code
     * @param wParam
     *            the w param
     * @param lParam
     *            the l param
     *
     * @return the int
     */
    int CallNextHookEx(Pointer hhk, int nCode, int wParam, int lParam);

    /*
     * HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod,
     * DWORD dwThreadId );
     */
    /**
     * Sets the windows hook ex a.
     *
     * @param idHook
     *            the id hook
     * @param lpfn
     *            the lpfn
     * @param hMod
     *            the h mod
     * @param dwThreadId
     *            the dw thread id
     *
     * @return the pointer
     */
    Pointer SetWindowsHookExA(int idHook, KeyboardProc lpfn, Pointer hMod, int dwThreadId);

    /** The W h_ keyboard. */
    int  WH_KEYBOARD  = 2;

    /*
     * BOOL UnhookWindowsHookEx( HHOOK hhk );
     */
    /**
     * Unhook windows hook ex.
     *
     * @param hhk
     *            the hhk
     *
     * @return true, if successful
     */
    boolean UnhookWindowsHookEx(Pointer hhk);

    /*
     * BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam
     * );
     */
    /**
     * Post message a.
     *
     * @param hWnd
     *            the h wnd
     * @param uMsg
     *            the u msg
     * @param wParam
     *            the w param
     * @param lParam
     *            the l param
     *
     * @return the int
     */
    int PostMessageA(Pointer hWnd, int uMsg, int wParam, int lParam);

  }

  /*
   * class KeyboardListnerClass implements KeyboardProc { KeyboardListner
   * _listner; KeyboardListnerClass(KeyboardListner listner) { _listner =
   * listner; }
   *
   * public int callback(int code, int wParam, int lParam) {
   * //_listner.keyRead(null); System.out.println("keyboard callback code: "
   * +code + " wParam "+ wParam + " lParam "+lParam ); return
   * MyUser32.INSTANCE.CallNextHookEx(null, code, wParam, lParam); } }
   *
   * public boolean addListner(KeyboardListner listner) { if
   * (_listners.get(listner) != null) return false; Pointer hinst = null;
   * PointerByReference hhinst = new PointerByReference(); //if
   * (MyKernel32.INSTANCE.GetModuleHandleExA(0, null, hhinst)) // hinst =
   * hhinst.getPointer(); / if (hinst == null) hinst =
   * MyKernel32.INSTANCE.GetModuleHandleA(null); Pointer handle = null;
   * KeyboardListnerClass iListner = new KeyboardListnerClass(listner); if
   * (hinst != null) handle =
   * MyUser32.INSTANCE.SetWindowsHookExA(MyUser32.WH_KEYBOARD, iListner,
   * hinst, 0); if (handle != null) { _listners.put(listner, handle); return
   * true; } else { int er = MyKernel32.INSTANCE.GetLastError();
   * System.out.println("error "+ Integer.toHexString(er)); }
   *
   * return false; }
   *
   * public boolean removeListner(KeyboardListner listner) { Pointer handle =
   * (Pointer) _listners.get(listner); if (handle != null) { if
   * (MyUser32.INSTANCE.UnhookWindowsHookEx(handle))
   * _listners.remove(listner); return true; } return false; }
   */

  /** The Constant WND_REGISTER_HOTKEY. */
  public static final int  WND_REGISTER_HOTKEY    = 999;

  /** The Constant WND_UNREGISTER_HOTKEY. */
  public static final int  WND_UNREGISTER_HOTKEY  = 998;

  /** The _dummy window. */
  DummyWindow        _dummyWindow      = DummyWindow.instance();

  /** The _keys. */
  MultiHashMap      _keys          = new MultiHashMap();

  /** The _listners. */
  Map            _listners        = new HashMap();

  /**
   * Instantiates a new windows xp keyboard.
   */
  public WindowsXPKeyboard()
  {
    try
    {
      _dummyWindow.waitTermination();
    }
    catch (InterruptedException e)
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    WndListner hotKeyHandler = new WndListner()
    {

      public int execute(int uMsg, int wParam, int lParam)
      {
        HotKey k = (HotKey) DummyWindow._hotKeys.get(new Integer(wParam));
        if (k == null)
          return 0;
        Collection listners = _keys.getCollection(k);
        if (listners == null)
          return 0;
        for (Iterator it = listners.iterator(); it.hasNext();)
        {
          HotKeyListner listner = (HotKeyListner) it.next();
          try
          {
            listner.keyPressed();
          }
          catch (Exception ex)
          {
            ex.printStackTrace();
          }
        }
        return 0;
      }

    };
    _dummyWindow.addListner(new Integer(DummyWindow.MyUser32.WM_HOTKEY), hotKeyHandler);

  }

  /*
   * (non-Javadoc)
   *
   * @seeorg.rzo.yajsw.os.Keyboard#registerHotkey(org.rzo.yajsw.os.Keyboard.
   * HotKeyListner, int, int)
   */
  public synchronized void registerHotkey(HotKeyListner listner, int mod, int key)
  {
    MyUser32.INSTANCE.PostMessageA(_dummyWindow._hWnd, WND_REGISTER_HOTKEY, mod, key);
    try
    {
      _dummyWindow.waitTermination();
    }
    catch (InterruptedException e)
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    HotKey k = _dummyWindow.new HotKey(mod, key);
    _listners.put(listner, k);
    _keys.put(k, listner);
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.rzo.yajsw.os.Keyboard#unregisterHotKey(org.rzo.yajsw.os.Keyboard.
   * HotKeyListner)
   */
  public synchronized void unregisterHotKey(HotKeyListner listner)
  {
    HotKey k = (HotKey) _listners.get(listner);
    if (k == null)
      return;
    _listners.remove(listner);
    _keys.remove(k, listner);
    Collection listners = _keys.getCollection(k);

    if (listners == null || listners.isEmpty())
    {
      MyUser32.INSTANCE.PostMessageA(_dummyWindow._hWnd, WND_UNREGISTER_HOTKEY, k._wParam, k._lParam);
      try
      {
        _dummyWindow.waitTermination();
      }
      catch (InterruptedException e)
      {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

}
TOP

Related Classes of org.rzo.yajsw.os.ms.win.w32.WindowsXPKeyboard$MyUser32$KeyboardProc

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.