000
18.10.2004, 12:16 Uhr
~tommazzo
Gast
|
Hallo!
Ich habe gestern begonnen ein kleines Programm zu schreiben um auch auf einer englischen Tastatur (z.B. meiner) Umlaute leicht schreiben au koennen ohne die Tastenbelegung zu aendern. Es faengt alle Tastatureingaben ab und schreibt sie in einen Buffer, wenn z.B. a und e zusammenkommen soll es zwei mal Backspace senden und danach den entsprechenden Umlaut. Hier ist der Code:
C++: |
#include "stdafx.h"
#include <windows.h> #include <stdio.h> #include <winuser.h> #include <windowsx.h> #include <locale>
#define DEBUG
using namespace std;
void get_keys(); /*checks for pressed keys*/ void set_buffer(char input); /*places the keystrokes in the buffer*/ void set_key(char key); /*outputs characters*/ void evaluate_buffer(); /*evaluates the buffer's contents and calls the output function if necessarry*/
char buf1, buf2; /*the buffer variables*/ bool enabled = true, shift = false, caps = false; locale loc ("German_Austria");
void main(void) { HWND stealth; /*creating a stealth window*/ AllocConsole(); stealth = FindWindowA("ConsoleWindowClass", NULL); ShowWindow(stealth, 0);
get_keys(); }
void get_keys() { short character; while(enabled) { Sleep(10); /*prevents 100% cpu usage*/
/*checks for pressed keys*/ for(character = 8; character <= 222; character++) { if (GetAsyncKeyState(character) == -32767) { if((character>=39)&&(character<=64)) { set_buffer(character); } else if((character>64)&&(character<91)) { character += 32; set_buffer(character); } else if(character == VK_SHIFT) shift = true; else if(character == VK_CAPITAL) { if(caps) caps = false; else caps = true; } } } } }
void set_buffer(char input) { if(shift || caps) { input = toupper(input, loc); /*converts the letter to uppercase if necessarry*/ shift = false; } buf2 = buf1; buf1 = input;
evaluate_buffer(); /*checks if an output is necessarry*/ }
/*evaluates the buffer's contents and calls the output function if necessarry*/ void evaluate_buffer() { switch(buf1) { case 'e': switch(buf2) { case 'a': set_key('ä'); break; case 'A': set_key('Ä'); break; case 'o': set_key('ö'); break; case 'O': set_key('Ö'); break; case 'u': set_key('ü'); break; case 'U': set_key('Ü'); break; } case 'E': switch(buf2) { case 'a': set_key('Ä'); break; case 'A': set_key('Ä'); break; case 'o': set_key('Ö'); break; case 'O': set_key('Ö'); break; case 'u': set_key('Ü'); break; case 'U': set_key('Ü'); break; } } if((buf2 == 's') && (buf1 == 'z')) set_key('ß');
/*makes sure the program can be exited easily if in debug mode*/ #ifdef DEBUG if((buf2 == 'e') && (buf1 == 'x')) enabled = false; #endif }
void set_key(char key) { keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0); if(caps || key == 'ß') { keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0); } //TODO find a function to simulate umlaute }
|
Es funktioniert alles, bis auf das Senden der Umlaute. In der MSDN Library habe ich nur Funktionen zum simulieren von Tastaturschlaegen (z.B. keybd_event()) gefunden, die aber in meinem Fall nicht funktionieren, da es ja bei einer englischen Tastatur keine Umlaute gibt. Irgendwie stecke ich fest - hat vielleicht jemand eine Idee wie ich diese Umlaute senden koennte?
Danke schon mal im Voraus! |