2012-09-02 71 views
0

我想編寫一個攔截用戶輸入並更改它的軟件。在後期的Windows 98以及之前我們的語言不被正式支持,所以程序員決定發明一種基於ASCII字符(ArmSCII)和字體的書寫方法,以便我們可以用我們的語言編寫。該軟件只是將英文inpur修改爲ArmSCII中的相關字符。該計劃現在已經老了。我想寫一個新的。它應該是全系統的。任何建議我怎樣才能鉤入鍵盤並改變輸入? C,C++或C#無關緊要。我沒事與他們..鍵盤掛鉤和更改用戶輸入

+2

要使用亞美尼亞資訊交換標準代碼爲什麼而不是普通的亞美尼亞語鍵盤佈局(從Windows本地化設置)? – Gir

+0

我自己使用unicode,但很多人要求ArmSCII,所以我也想這樣做。 –

回答

2

這裏是一個鍵盤鉤子截獲用戶輸入,並將其變爲printf("ha ha, I intercepted your [%c] and changed it to [%c]\n", key, key+1);

Win32控制檯C/C++代碼:

#define _WIN32_WINNT 0x0400 
#pragma comment(lib, "user32.lib") 

#include <windows.h> 
#include <stdio.h> 

HHOOK hKeyboardHook; 

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    DWORD SHIFT_key=0; 
    DWORD CTRL_key=0; 
    DWORD ALT_key=0; 

    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)))  
    { 
     KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); 
     DWORD dwMsg = 1; 
     dwMsg += hooked_key.scanCode << 16; 
     dwMsg += hooked_key.flags << 24; 
     char lpszKeyName[1024] = {0}; 
     //lpszKeyName[0] = '['; 

     int i = GetKeyNameText(dwMsg, (lpszKeyName+1),0xFF) + 1; 
     //lpszKeyName[i] = ']'; 

     int key = hooked_key.vkCode; 

     SHIFT_key = GetAsyncKeyState(VK_SHIFT); 
     CTRL_key = GetAsyncKeyState(VK_CONTROL); 
     ALT_key = GetAsyncKeyState(VK_MENU); 

     if (key >= 'A' && key <= 'Z') 
     { 

      if (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32; 

      if (CTRL_key !=0 && key == 'y') 
      { 
       MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "H O T K E Y", MB_OK); 
       CTRL_key=0; 
      } 

      if (CTRL_key !=0 && key == 'q') 
      { 
       MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK); 
       PostQuitMessage(0); 
      } 




      //printf("key = %c\n", key); 
      printf("ha ha, I intercepted your [%c] and changed it to [%c]\n", key, key+1); 

      SHIFT_key = 0; 
      CTRL_key = 0; 
      ALT_key = 0; 

     } 

     //printf("lpszKeyName = %s\n", lpszKeyName); 
    // printf("%s", lpszKeyName); 
    } 
    return CallNextHookEx(hKeyboardHook, nCode,wParam,lParam); 
} 

void MessageLoop() 
{ 
    MSG message; 
    while (GetMessage(&message,NULL,0,0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
} 

DWORD WINAPI my_HotKey(LPVOID lpParm) 
{ 
    HINSTANCE hInstance = GetModuleHandle(NULL); 
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1; 

    hKeyboardHook = SetWindowsHookEx ( WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent, hInstance, NULL ); 
    MessageLoop(); 
    UnhookWindowsHookEx(hKeyboardHook); 
    return 0; 
} 

int main(int argc, char** argv) 
{ 
    HANDLE hThread; 
    DWORD dwThread; 

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) my_HotKey, (LPVOID) argv[0], NULL, &dwThread); 

    //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 

    if (hThread) return WaitForSingleObject(hThread,INFINITE); 
    else return 1; 

} 
+0

應用程序中有很多構建錯誤..: –