Toon posts:

[C(++?)] KBD Layout DLL: waar beginnen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de afgelopen maanden naar Dvorak gekeken, met redelijke interesse. Het voelt serieus beter aan (alleen heb ik net te weinig motivatie om goed te trainen). Maar als ik dan wat links doorklik, kom ik uit op sites die zelf een nog betere variant hebben bedacht. Dat kan ik natuurlijk beter :D
Het recept:
-Een keylogger (geen probleem)
-Wat AI (eventjes goed lezen en ook geen probleem)
-Een keyboard layout aanpas-code (wel een probleem)

Mijn vraag is dus: hoe pas ik de layout van mijn keyboard in real-time aan? Ik heb zelf al wat dingen ontdekt (heb ik al gezegd dat ik winXPhomeSP2 draai?):
-In het register staat een tabel met alle bekende DLL's
-Daar kun je dingen bij toevoegen mbv. kbdgen.exe
-Die DLL's ontvangen de low-level toetsaanslagen en zetten die om in letters
-M$ heeft ook een tooltje om toetsenbordlayouts te maken, maar die is niet real time (voor de geïnteresseerden: google naar "microsoft keyboard layout creator" of "msklc")

Nou had ik zelf dus als plan om met een keylogger alles bij te houden mbt letters. Alles, behalve a-z, A-Z, en [];'./{}:"<>? wordt op de oude plek bewaard, de rest filter ik er min of meer uit (oid).
Dan laat ik er AI op los (in zo veel mogelijk real-time en zonder start-tekens van mij) om een goede verbetering te berekenen (ik dacht zelf aan genetische evolutie).
Die AI schrijft de layout weg naar een bestand, die vervolgens om de minuut (ofzo) wordt gelezen door de DLL om te updaten. Als er iets anders is, maakt die een schermpje aan met het bericht welke letters waar staan in plaats van waar.

Zelf heb ik al http://www.reactos.org/wi.../create_a_keyboard_layout gevonden, maar daar wordt ik niet veel wijzer van. Op sourceforge heb ik lichtjes gezocht naar een soort van simpele voorbeeld-layout-source, maar ik weet niet echt waar ik naar moet zoeken. Weet iemand hoe ik mijn eigen DLL's schrijf voor keyboard layouts (waar kan ik een api reference vinden?)? Iemand nog verbeteringen in mijn idee toe te voegen?

Bij voorbaat dank.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:23
Ik denk dat je helemaal gek wordt als je je keyboard layout real-time gaat veranderen (sowieso worden je statistieken nogal verpest als je steeds op de verkeerde toetsen drukt).

Om in te gaan op je vraag: ik heb voor Dvorak onder Windows (bij gebrek aan het ueber-configureerbare xkb) een tooltje dat een GetMessage hook gebruikt om alle toetsaanslagen af te vangen en te mappen op een andere toets. Dat werkt voor Windows-applicaties prima, hoewel programma's die scancodes gebruiken (cmd.exe is een belangrijk voorbeeld, maar DOSBox bijvoorbeeld ook) er aan ontkomen. Misschien kun je daar iets mee.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik miste op mijn eigen toetsenbord een volume up/down toets, en dus heb ik een tooltje gemaakt die de favorites en e-mail toetsen naar volume up/down mapt dmv een lowlevel keyboard hook. Dat werkte perfect, ook in console windows en in games.

De source:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define _WIN32_WINNT  0x0500
#include <windows.h>

HHOOK hHook;
LRESULT CALLBACK KeyProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT * data = (KBDLLHOOKSTRUCT*)lParam;
        bool up = (data->flags & LLKHF_UP) != 0;

        if (data->vkCode == VK_BROWSER_FAVORITES)
        {
            keybd_event(VK_VOLUME_UP, 0, KEYEVENTF_EXTENDEDKEY | (up ? KEYEVENTF_KEYUP : 0), data->dwExtraInfo);
            return 1;
        }
        else if (data->vkCode == VK_LAUNCH_MAIL)
        {
            keybd_event(VK_VOLUME_DOWN, 0, KEYEVENTF_EXTENDEDKEY | (up ? KEYEVENTF_KEYUP : 0), data->dwExtraInfo);
            return 1;
        }
    }

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

int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd)
{
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyProc, hInstance, 0);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hHook);

    return (int)msg.lParam;
}
M$
Vind je dat niet wat kinderachtig? Hier op GoT wordt het iig niet op prijs gesteld.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.