“od czytelnika”

na klawiaturach pojawia sie często duża ilość klawiszy, które robią różne dziwne rzeczy – czasem nie takie, jak by się chciało. zamieszczam skypt winAPI który służy do przemapowania klawiszy. w kodzie znajduje się krótki opis samych klawiszy. do skompilowania można użyć np. małego darmowego devcpp.

/***********************************************************
** kbhook.cpp                                            **
**                                                        **
**  Copyright 2009 liamk@o2.pl, All Rights Reserved       **
**   Free Usage granted to the public domain.             **
**                                                        **
***********************************************************/

#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif            
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410
#endif
#ifndef _WIN32_IE
#define _WIN32_IE 0x0600
#endif

#include "Windows.h"
#include "winuser.h"

#define _EXIT_KBHOOK_    0xff

typedef struct SVKMap
{
    BYTE bVkToReplace;
    BYTE bVkReplaceWith;
}*PSVKMap;

int _iVKMapElemCnt = 0;
int _iVKMapElemSize = 0;

// define here key mapping, it's only thing you have to do
// VK_KEY macros are defined in winuser.h
SVKMap _aVKMap[] =
{
  {VK_BROWSER_FORWARD, VK_VOLUME_UP}, // this will make browser forward key to volume up
  {VK_SHIFT, VK_CONTROL},        // will change shift to control
  {'Z', 'X'},              // Z key wil become X key
  {VK_ESCAPE, _EXIT_KBHOOK_}      // escape will exit programm
};

int CompareVKMap( const void* pVkMap1, const void* pVkMap2 )
{
  return ((PSVKMap)pVkMap1)->bVkToReplace - ((PSVKMap)pVkMap2)->bVkToReplace;
}

LRESULT CALLBACK LowLevelKeyboardProc( int nCode,
                                       WPARAM wParam,
                                       LPARAM lParam)
{
  if (nCode == HC_ACTION )
  {
    PSVKMap pVKMap = (PSVKMap)bsearch( &((PKBDLLHOOKSTRUCT)lParam)->vkCode, _aVKMap, _iVKMapElemCnt, _iVKMapElemSize, CompareVKMap );

    if( pVKMap != NULL )
    {
      if( pVKMap->bVkReplaceWith == _EXIT_KBHOOK_ )
      {
        PostQuitMessage( 0 );
      }
      else
      {
        keybd_event( pVKMap->bVkReplaceWith, 0, wParam == WM_KEYUP || wParam == WM_SYSKEYUP ? KEYEVENTF_KEYUP : 0, 0 );
      }
      return -1;
    }
  }

  return CallNextHookEx( NULL, nCode, wParam, lParam );
}


int WINAPI WinMain( HINSTANCE hinstExe,
                    HINSTANCE hPrevInstance,
                    PTSTR pszCmdLine,
                    int iCmdShow )
{

  MSG sMSG;
  int iRet = 0;

  _iVKMapElemSize = sizeof(_aVKMap[0]);
  _iVKMapElemCnt = sizeof(_aVKMap) / _iVKMapElemSize ;
  qsort( _aVKMap, _iVKMapElemCnt, _iVKMapElemSize, CompareVKMap );

  HHOOK hhkLowLevelKybd = SetWindowsHookEx( WH_KEYBOARD_LL,
                        LowLevelKeyboardProc,
                        hinstExe,
                        NULL );

  if( hhkLowLevelKybd != NULL )
  {
    while( (iRet = GetMessage( &sMSG, 0, 0, 0 ) ) != 0 )
    {
      if( iRet == -1 )
      {
        PostQuitMessage( GetLastError() );
        break;
      }
      else
      {
        TranslateMessage(&sMSG);
        DispatchMessage(&sMSG);
      }
    }

    if( !UnhookWindowsHookEx( hhkLowLevelKybd ) )
    {
      sMSG.wParam = GetLastError();
    }
  }
  else
  {
    sMSG.wParam = GetLastError();
  }

  return( (int)sMSG.wParam );
}

źródełko do possania (;

może zaoszczędzi to komuś czasu i pozwoli scustomizować sobie odpowiednio środowisko.

n.

PS. wtyczka kolorująca kod do live writera

-o((:: sprEad the l0ve ::))o-

Comments (8)

  1. mwd

    Odpowiedz

    Dopnę się pod artykuł dwoma odnośnikami:

    1. Jak komuś się nie chce babrać w kompilowanie i szukanie nazw klawiszy, to polecam KeyTweak:

    » http://webpages.charter.net/krumsick/

    …ewentualnie SharpKeys, który jest podobny w użyciu do załączonego kodu:

    » http://www.randyrants.com/2006/04/sharpkeys_21.html

    2. Jak ktoś chciałby mieć własny sterownik klawiatury i dopasować sobie układ klawiszy „pod siebie”, to może się pobawić w „Microsoft Keyboard Layout Creator 1.4” — do znalezienia na microsoft.com.

    PS: Ja się oczywiście pobawiłem MKLC, dzięki czemu mam pod prawym Altem polskie cudzysłowy i trochę innych znaków interpunkcyjnych. :)

  2. liamk

    Odpowiedz

    remapkey (i wiekszosc podobnych) nie potrafi mapowac klawiszy ktorych nie ma na klawiaturze a tym pragram przemapujesz sobie np. zbedny multimedialny key „open email client” na o wiele praktyczniejszy „volume up” , ktorego akurat na twojej klawie fizycznie zabraklo.

  3. WiT

    Odpowiedz

    Ja polecam darmowy SharpKeys. Przydał mi się przy okazji remapowania dodatkowych przycisków z japońskiej klawiatury – mam np. cztery ALTy obok siebie – nie sposób nie trafić ;)

  4. liamk

    Odpowiedz

    SharpKeys faktycznie jest najlepszym softem tego typu. Co wazne – zrobi swoje, wpisze w rejestr i mozna go zamknac i zapomniec. Gdyby tylko nie fakt, ze nie rozpoznaje klawiszy multimedialnych na mojej klawiawiaturze …

  5. liamk

    Odpowiedz

    @Tomk
    kolega wypytal szczegolowo googl’a i przez pol dnia nic nie znalazl. Oczywiscie przetestowal kazdy wymieniony tutaj program i wiele niewymienionych . MSKLC nie dziala z mulimedialnymi klawiszami na winXP wcale, KeyTweak podbnie jak sharpkeys nie rozpoznaje ich prawidlowo lub wcale. Generalnie nie ma zadnego softu, ktory byl wstanie zamienic key „open email klient” na nieistniejeacy na mojej klawie „volume down”…dlatego musialem napisac soft wlasnorecznie … bo wlasnie na podmianie klawiszy multimedialnych mi zalezalo.

    @mwd
    Sharpkeys w zadnym ukladzie nie jest podobny do zalaczonego kodu. SK Ma GUI i nie wymaga kompilacji. Dziala na zasadzie podmiany mapy klawiszy w rejestrze a zalaczony kod GUI nie posiada, nie tyka rejestru, tylko tworzy procedure typu hook, dzialajaca w czasie rzeczywistym i wymaga by thread z ta procka dzialal w tle…zupelnie inna technologia, laczy ja tylko efekt koncowy.

  6. olo

    Odpowiedz

    OK, ja nie wiem o co biega ale czy ktoś jest mi w stanie potwierdzić czy dzięki powyższej wiedzy będzie możliwa podmiana player-a na klawiaturze Samsung SDM4500P? Domyślnie Samsung oferuje obsługę tylko dwóch – Windows Media Player oraz Winamp – ja akurat używam foobar-a. Podobnie ma się sprawa z przeglądarką internetową, widzi tylko IE oraz Netscape-a – używam FF :/.
    Z góry dzięki za odpowiedź.

Skomentuj WiT Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.