Zum Inhalt springen

Schopenhauer

Mitglieder
  • Gesamte Inhalte

    4
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Schopenhauer

  1. Hallo, Ich will ein Programm schreiben, welches einen Hook für ein anderes Programm insatlliert. Dieser Hook soll sämtliche WM_CHAR Nachrichten abfangen und sie einem globalen char Array, der mir einer index Variable durchalufen wird, gleichsetzen. Wenn ich also danach einige beliebige Tasten drücke, sollte der char Array ausgegeben werden und nicht die Zeichen der gedrückten Tasten. Das ganze funktioniert ganz gut, doch manchamal werden einzelne Zeichen des char Array nicht ausgegeben. Wenn im Array z.B der String "Hallo Forum!" abgelegt ist und ich danach einige Tasten drücke erscheint z.B "Hall Forum!" im Edit-Feld. Wiso ist dies so? Ich ziemlich ratlos. Hier noch die Hook-Funktion. MSG *Nachricht; if(nCode<0) CallNextHookEx(hook,nCode,wParam,lParam); switch(nCode) { case HC_ACTION: Nachricht=(MSG*) lParam; if(Nachricht->message==WM_CHAR) { /*Der Char Array Schrebivorlage und der integer zaehler sind gloabal deklariert*/ Nachricht->wParam=Schreibvorlage[zaehler]); lParam=(LPARAM)Nachricht; zaehler++; return CallNextHookEx(hook,nCode,wParam,lParam); } default: break; } return 0; } Im Voraus besten Dank für sämtliche Antworten.
  2. Hallo, Ich habe eine Frage zu meinem derzeitigem Projekt und da ich zu diesem vor ein paar Tagen bereits Hilfe bekommen habe könnt ihr mir vielleicht auch jetzt weiterhelfen:) . Ich will, dass bei einem bestimmten Programm, egal welche Taste man drückt immer ein bestimmter Text ausgegeben wird. Ich regle das mit einem Hook, den ich auf das Programm ansetze. Der Hook fängt alle WM_CHAR Nachrichten ab und übprüft die Nachricht auf Gleichheit mit einem char Array, der mit einer index Varialbe durchlaufern wird. Stimmt die WM_CHAR Nachricht mit dem akteuellen Char des Array überrein wird die Nachricht unverändert weitergeleitet, ansonsten ändert der Hook die Nachricht, so dass sie übereinstimmt. Das ganze Funktioniert tadelos, wenn der char Array z.b mit dem String "Hallo Welt!\0" gefüllt ist, kann ich 5 mal die Taste <R> drücken und im aktiven Editorfeld des Programms erscheint dann trozdem "Hallo". Nur Zeilenumbrüche werden doppelt dargestellt! Wiso ist das so? Hier der Code: /*Die Dll enthätlt 3 Funktionen, die eine Lädt eine Datei in einen globalen char Array, die andere installiert den Hook und die dritte ist die HookFunktion*/ #include <windows.h> #pragma data_seg("shared") char Schreibvorlage[1024] = "\0"; #pragma data_seg() #pragma comment(linker,"/SECTION:shared,RWS") HHOOK hook; HINSTANCE hDllInstance; int zaehler=0; __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { hDllInstance=hInstance; return TRUE; } __declspec (dllexport) LRESULT CALLBACK Filtern(int nCode, WPARAM wParam, LPARAM lParam) { MSG *Nachricht; char v; if(nCode<0) CallNextHookEx(hook,nCode,wParam,lParam); switch(nCode) { case HC_ACTION: Nachricht=(MSG*) lParam; if(Nachricht->message==WM_CHAR) { v=Nachricht->wParam; if(v!=Schreibvorlage[zaehler]) { Nachricht->wParam=Schreibvorlage[zaehler]); lParam=(LPARAM)Nachricht; zaehler++; CallNextHookEx(hook,nCode,wParam,lParam); return 0; } zaehler++; return 0; } default: break; } return 0; } __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void) { PROCESS_INFORMATION pi; STARTUPINFO su; GetStartupInfo(&su); CreateProcess("C:\\Programme\\Tastaturschreiben\\Tastatur.exe",NULL,0,0,0,0,NULL,NULL,&su,π); WaitForInputIdle(pi.hProcess,3000); hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Filtern,hDllInstance,pi.dwThreadId); return 0; } __declspec (dllexport) LRESULT CALLBACK dateiladen(void) { static OPENFILENAME ofn; HANDLE hFile; int dateigroesse; DWORD gelesenebytes; static char Dateiname[256], Pfad[256]; const char szFilter[] = "Schreibvorlage(*.TXT)\0*.txt\0\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = FindWindow(NULL,"Gosch"); ofn.hInstance=NULL; ofn.lpstrFilter=szFilter; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=0, ofn.lpstrFile=Pfad; ofn.nMaxFile=MAX_PATH; ofn.lpstrFileTitle=NULL; ofn.nMaxFileTitle=MAX_PATH; ofn.lpstrInitialDir=NULL; ofn.lpstrTitle=Dateiname; ofn.Flags=OFN_HIDEREADONLY | OFN_CREATEPROMPT; ofn.nFileOffset=0; ofn.nFileExtension=0; ofn.lpstrDefExt="txt"; ofn.lCustData = 0L; ofn.lpfnHook = NULL; ofn.lpTemplateName =NULL; GetOpenFileName(&ofn); hFile=CreateFile(Pfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); dateigroesse=GetFileSize(hFile,NULL); ReadFile(hFile,Schreibvorlage,dateigroesse,&gelesenebytes,NULL); CloseHandle(hFile); return 0; } /* Die Exe ruft die beiden Funktionen dateiladen() und Hooksetzen auf*/ #include <windows.h> __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; static char szAppName[] = "Gosch"; wndclass.style = NULL; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName,szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE hFilterdll; switch (message) { case WM_CREATE: dateiladen(); Hooksetzen(); break; case WM_QUIT: break; } return DefWindowProc (hwnd, message, wParam, lParam); } Ich hoffe ich konnte mein Problem möglichst genau schildern und danke im Voraus für alle Antworten.
  3. Danke für die schnelle Antwort. Braucht es dazu nicht nocht irgendwelche spezielle Linker einstellungen? Und Funktioniert dies mit allen Compilern? (Ich verwende C++-Builder 6.0).
  4. Hallo, Ich will ein Programm schreiben, welches einen Hook für ein anderes Programm installiert und alle WM_CHAR Nachrichten verändert. Es soll eine Datei in einen globalen char Array geladen und mit einer index Variable durchlaufen werden. In der Hook-Funktion soll danach üperpfüft werden, ob die WM_CHAR Nachricht dem aktuellen char des Array entspicht, falls dies nicht der Fall ist soll der Hook die WM_CHAR nachrichten entsprechend verändern. Die Hookfunktion kann jedoch nicht auf den char Array zuegreifen (das Programm lässt sich zwar fehlerfrei Compilern&Linken, der Array hat in der Hook-Funktion jedoch immer den Wert Null). Wiso ist dies so? Hier der Quellcode der Dll und der exe-Datei: /*Die Dll enthätlt 3 Funktionen, die eine Lädt eine Datei in einen globalen char Array, die andere installiert den Hook und die dritte ist die HookFunktion*/ #include <windows.h> char Schreibvorlage[1024]; HHOOK hook; HINSTANCE hDllInstance; int zaehler=0; __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { hDllInstance=hInstance; return TRUE; } __declspec (dllexport) LRESULT CALLBACK Filtern(int nCode, WPARAM wParam, LPARAM lParam) { /* Die Hook-Funktion kann seltsamerweise nicht auf den Array Schreibvorlage zugrefien, er Array hat den Wert NULL) MSG *Nachricht; char v; if(nCode<0) CallNextHookEx(hook,nCode,wParam,lParam); switch(nCode) { case HC_ACTION: Nachricht=(MSG*) lParam; if(Nachricht->message==WM_CHAR) { v=Nachricht->wParam; if(v!=Schreibvorlage[zaehler]) { Nachricht->wParam=Schreibvorlage[zaehler]); lParam=(LPARAM)Nachricht; zaehler++; CallNextHookEx(hook,nCode,wParam,lParam); return 0; } zaehler++; return 0; } default: break; } return 0; } __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void) { PROCESS_INFORMATION pi; STARTUPINFO su; GetStartupInfo(&su); CreateProcess("C:\\Programme\\Tastaturschreiben\\Tastatur.exe",NULL,0,0,0,0,NULL,NULL,&su,π); WaitForInputIdle(pi.hProcess,3000); hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Filtern,hDllInstance,pi.dwThreadId); return 0; } __declspec (dllexport) LRESULT CALLBACK dateiladen(void) { static OPENFILENAME ofn; HANDLE hFile; int dateigroesse; DWORD gelesenebytes; static char Dateiname[256], Pfad[256]; const char szFilter[] = "Schreibvorlage(*.TXT)\0*.txt\0\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = FindWindow(NULL,"Gosch"); ofn.hInstance=NULL; ofn.lpstrFilter=szFilter; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=0, ofn.lpstrFile=Pfad; ofn.nMaxFile=MAX_PATH; ofn.lpstrFileTitle=NULL; ofn.nMaxFileTitle=MAX_PATH; ofn.lpstrInitialDir=NULL; ofn.lpstrTitle=Dateiname; ofn.Flags=OFN_HIDEREADONLY | OFN_CREATEPROMPT; ofn.nFileOffset=0; ofn.nFileExtension=0; ofn.lpstrDefExt="txt"; ofn.lCustData = 0L; ofn.lpfnHook = NULL; ofn.lpTemplateName =NULL; GetOpenFileName(&ofn); hFile=CreateFile(Pfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); dateigroesse=GetFileSize(hFile,NULL); ReadFile(hFile,Schreibvorlage,dateigroesse,&gelesenebytes,NULL); CloseHandle(hFile); return 0; } /* Die Exe ruft die beiden Funktionen dateiladen() und Hooksetzen auf*/ #include <windows.h> __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; static char szAppName[] = "Gosch"; wndclass.style = NULL; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName,szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE hFilterdll; switch (message) { case WM_CREATE: dateiladen(); Hooksetzen(); break; case WM_QUIT: break; } return DefWindowProc (hwnd, message, wParam, lParam); } Ich hoffe ich konnte mein Problem möglichst genau schildern und danke im Voraus für alle Antworten.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...