Problem mit SendInput
-
Hi,
Habe wiedermal ein Problem :
Ich habe die Aufgabe bekommen einen Text über eine Serielle Schnittstelle abzufragen und diesen dann an eine vom Benutzer wählbare Anwendung zu senden.
Da ich erstmal mit SendInput einen Text richtig verschicken möchte habe ich zum testen erstmal ein Memo für den TextInput genommen.
Mein Problem ist jetzt :
Text wird komplett richtig übertragen, Zeichen jedoch (wie "." "," "+" usw.) werden einfach weggelassen und ich komm nicht drauf warum
Hier noch etwas code der vielleicht helfen könnte :
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString progname = Edit1->Text; AnsiString text = Memo1->Lines->Text; dazu = 0; int* pos=new int[text.Length()]; for(int i=1;i<=text.Length();i++) { int puffer = static_cast<char>(text[i]); if((puffer>=65)&&(puffer<=90)){ pos[dazu]=i; dazu++; } } text = UpperCase(text); DWORD SendDataTo(TCHAR* iWndName, TCHAR* iData,int hinzu,int* pos=new int[dazu]); SendDataTo(progname.c_str(), text.c_str(), dazu, pos); } //--------------------------------------------------------------------------- DWORD SendDataTo(TCHAR* iWndName,TCHAR* iData,int hinzu,int* pos) { if(iWndName==NULL||iData==NULL) return -1L; if(strlen(iWndName)==0||strlen(iData)==0)return -2L; //Fenster wird gesucht HWND myHWND = ::FindWindow(NULL,iWndName); if(myHWND==NULL) return GetLastError(); if(!SetForegroundWindow(myHWND)) return GetLastError(); int textlen = strlen(iData); //Anzahl der Zeichen UINT Len = (textlen*2)+(hinzu*2)+2; //Alle Tasten drücken/loslassen + //Shift drücken/loslassen + Enter drücken/loslassen INPUT* input= new INPUT[Len]; int i = 0; int u = 0; int o = 0; while(i < (Len-2)) { if((pos[o]-1)==u) { //-----------------------Bei großen Buchstaben------------------- input[i].type=INPUT_KEYBOARD; //-----------Shift drücken-------- input[i].ki.wVk = VK_RSHIFT; input[i].ki.wScan = 0; input[i].ki.dwFlags = 0; input[i].ki.dwExtraInfo = 0; i++; input[i].type=INPUT_KEYBOARD; //-----------Buchstabe drücken-------- input[i].ki.wVk = iData[u]; input[i].ki.wScan = 0; input[i].ki.dwFlags = 0; input[i].ki.dwExtraInfo = 0; i++; input[i].type=INPUT_KEYBOARD; //-----------Buchstabe loslassen-------- input[i].ki.wVk = iData[u]; input[i].ki.wScan = 0; input[i].ki.dwFlags = KEYEVENTF_KEYUP; input[i].ki.dwExtraInfo = 0; i++; input[i].type=INPUT_KEYBOARD; //-----------Shift loslassen-------- input[i].ki.wVk = VK_RSHIFT; input[i].ki.wScan = 0; input[i].ki.dwFlags = KEYEVENTF_KEYUP; input[i].ki.dwExtraInfo = 0; i++; u++; o++; } else { //-----------------------Bei kleinen Buchstaben------------------- input[i].type=INPUT_KEYBOARD; //-----------Buchstabe drücken-------- input[i].ki.wVk = iData[u]; input[i].ki.wScan = 0; input[i].ki.dwFlags = 0; input[i].ki.dwExtraInfo = 0; //----------Taste loslassen :--------- i++; input[i].type=INPUT_KEYBOARD; //-----------Buchstabe loslassen-------- input[i].ki.wVk = iData[u]; input[i].ki.wScan = 0; input[i].ki.dwFlags = KEYEVENTF_KEYUP; input[i].ki.dwExtraInfo = 0; i++; u++; } } input[i].type=INPUT_KEYBOARD; //-----------Enter drücken-------- input[i].ki.wVk = VK_RETURN; input[i].ki.wScan = 0; input[i].ki.dwFlags = 0; input[i].ki.dwExtraInfo = 0; i++; input[i].type=INPUT_KEYBOARD; //-----------Enter loslassen-------- input[i].ki.wVk = VK_RETURN; input[i].ki.wScan = 0; input[i].ki.dwFlags = KEYEVENTF_KEYUP; input[i].ki.dwExtraInfo = 0; int cbSize = sizeof(INPUT); //--------TEST-------- (was steht kurz vorm senden alles in "input" char *test = new char[Len]; for(int u=0;u<=(Len);u++) { test[u]=input[u].ki.wVk; //nun kann bei EinzelAnweisungen nachgeschaut } //werden was in "test" (einem Abbild von "input") steht //--------TEST-------- UINT len= SendInput(Len,input,cbSize); //Hier wird nun gesendet DWORD ErrCode(0); if(len < Len) { ErrCode = GetLastError(); } if(input) { delete[] input; } return ErrCode; }Im großen und ganzen wird der Text eingelesen und wenn es ein Großbuchstabe ist wird ein Shift druckt mit "simuliert" und dann erst der eigentliche Tastendruck simuliert und ansonsten nur der eigentliche Tastendruck...
Bitte helft mir ich weiß echt nicht mehr weiter
Gruß PillathMrNight
-
Hallo
if((puffer>=65)&&(puffer<=90)){Mfg
Klaus
-
Hi Klaus,
Danke für deine Antwort aber mit dieser Zeile filtere ich nur die Großbuchstaben raus und makiere dannach ihre position im text um vor jedem dieser Buchstaben einen Druck der Shift Taste zu erzeugen, damit der Buchstabe auch nach dem Senden groß geschrieben wird.Ich bruache dringend eine Antwort . Es wird sich doch irgendwer mit SendInput beschäftigt haben ...

Gruß PillathMrNight
-
Du solltest dich mal mit virtuellen Tasten (Virtual Keys) beschäftigen.
Dann verstehst du vielleicht den groben Denkfehler in deinem Programm!!!Bei "ki.wVk" wird ein "Virtual Key" erwartet, kein ASCII-Code!!!
-
Vielen Dank Th es funktioniert nun.
Wirklich grober Denkfehler
Gruß PillathMrNight