Dienst selbst programmieren
-
Ich möchte selbst einen Windows-Dienst programmieren, der bestimmte Tastaturbefehle abfängt und entsprechend verarbeitet. Ich habe mich ein wenig belesen und bisher habe ich herausgefunden, dass ich einen sog. Keyboard-Hook benötige. Anhand dieses Threads habe ich bisher folgendes geschrieben:
//MeinDienst.h class Hooks { public: void KeyBoardHook(); }; //MeinDienst.cpp void KeyPress() { } void Hooks::KeyBoardHook() { int TastaturHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPR OC KeyPress,hInstGlob,NULL); if(TastaturHook==NULL) { MessageBox(NULL,"Hat nicht geklappt."); } }
Der Code ist natürlich noch arg Fehlerhaft, aber ich weiß nicht so recht, wie genau ich nun weiter verfahren muss. Ist mein Ansatz mit der KeyPress-Funktion soweit richtig?
Der Compiler spuckt die Meldung aus, dass SetWindowsHookEx kein bekannter Bezeichner sei.
-
GR-Thunderstorm schrieb:
Ich möchte selbst einen Windows-Dienst programmieren, der bestimmte Tastaturbefehle abfängt und entsprechend verarbeitet.
Das ist nicht so einfach und vor allem nicht unproblematisch, denn Dienste laufen in einer separaten Window Station, sodass sie normalerweise keinen Input empfangen können: http://msdn.microsoft.com/en-us/library/ms683502.aspx
Ab Windows Vista geht das überhaupt nicht mehr.Was deinen Hook angeht: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960.aspx#installing_releasing
msdn schrieb:
You must place a global hook procedure in a DLL separate from the application installing the hook procedure.
-
dot schrieb:
GR-Thunderstorm schrieb:
Ich möchte selbst einen Windows-Dienst programmieren, der bestimmte Tastaturbefehle abfängt und entsprechend verarbeitet.
Das ist nicht so einfach und vor allem nicht unproblematisch, denn Dienste laufen in einer separaten Window Station, sodass sie normalerweise keinen Input empfangen können: http://msdn.microsoft.com/en-us/library/ms683502.aspx
Ab Windows Vista geht das überhaupt nicht mehr.Was deinen Hook angeht: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960.aspx#installing_releasing
msdn schrieb:
You must place a global hook procedure in a DLL separate from the application installing the hook procedure.
Hmm mit DLLs habe ich noch nie gearbeitet..
Also müsste ich mich zu allererst noch da reinarbeiten...
Was ich mit dem Programm erreichen will ist folgendes:
Ich schreibe in Vorlesungen mit meinem Laptop mit und muss regelmäßig griechische Symbole eintippen. Diese sind aber normalerweise nur über irgendwelche Extrafunktionen oder -fenster aufrufbar und in manchen Programmen geht es überhaupt nicht, einzelne Zeichen in einer anderen Schriftart oder dergleichen zu Schreiben.
Also habe ich mir überlegt, das ganze so zu programmieren, dass ich z.B. Strg+AltGr+a drücke und in meinem Programm (z.B. OpenOffice) erscheint ein α.
-
An deiner Stelle würd ich zuallererst mal schauen ob:
- Man in OpenOffice nicht sowieso schon solche Shortcuts definieren kann
- Man das in OpenOffice nicht per Skript oder Makro erreichen kann
- Man das in OpenOffice nicht per PlugIn erreichen kann
- Du nicht besser einfach gleich LaTeX lernen solltest
-
Hast du http://www.oeaw.ac.at/kal/multikey/ schon gefunden?
-
dot schrieb:
An deiner Stelle würd ich zuallererst mal schauen ob:
- Man in OpenOffice nicht sowieso schon solche Shortcuts definieren kann
- Man das in OpenOffice nicht per Skript oder Makro erreichen kann
- Man das in OpenOffice nicht per PlugIn erreichen kann
- Du nicht besser einfach gleich LaTeX lernen solltest
In OO löse ich das mit der AutoKorrektur. Wenn ich %alpha eintippe, erscheint der entsprechende Buchstabe. Aber das ist nur bedingt befriedigend. Im Foxit-Reader (mein Hauptwerkzeug im Studium) kann man derartiges überhaupt nicht selbst einstellen. Dort kann man auch nicht einfach die Schriftart für ein einzelnes Zeichen abändern, um so evtl auf diese Symbole Zugriff zu haben.
@Dirk:
Selber programmieren macht aber viel mehr Spaß.
-
Wenn es nicht unbedingt Speziell für ein bestimmtes Programm sein muss:
[Fragt alle Tastatureingaben Global ab. ]
#include <windows> #include <iostream> using namespace std; int main() { short key; char szKey[MAX_PATH]; int scan; while(1) { Sleep(1); // avoid 10 for(key=0;key<256;key++) { if(GetAsyncKeyState(key)==-32767) { scan=MapVirtualKeyEx(key,0,GetKeyboardLayout(0)); GetKeyNameText(scan << 16,szKey,MAX_PATH); cout<<"Key: "<<szKey<<endl; cout<<"Scancode: "<<scan<<endl; if ( scan == 30 ) // 30 == a { cout<<"a wurde gedrueckt"<<endl; // mit SendMessage dann deinen Buchstaben // an OpenOffice senden sollte funktionieren } } } } }
Ansonsten kannst du vielleicht auch die Tastatureingaben nur mit loggen lassen wenn sich z.b. OpenOffice im Vordergrund befindet.
-
OOps
Sleep(1); //nicht avoid 10 sondern cpu entlasten