Text an fremde Fenster senden (Problem: irgendwann kommt nur noch Datenmüll an)
-
Hi Leute,
hab da ein kleines Prob. mit einer Funktion
void __fastcall TForm1::TextSend(AnsiString fenster, AnsiString Text) { int x; int key=' ',gross,altgr; HWND window=FindWindow(0,fenster.c_str()); SetForegroundWindow(window); for(x=0;x<Text.Length();x++) { switch(Text.c_str()[x]) { case'a':{key='A';gross=0;altgr=0;break;} case'b':{key='B';gross=0;altgr=0;break;} case'c':{key='C';gross=0;altgr=0;break;} case'd':{key='D';gross=0;altgr=0;break;} case'e':{key='E';gross=0;altgr=0;break;} case'f':{key='F';gross=0;altgr=0;break;} case'g':{key='G';gross=0;altgr=0;break;} case'h':{key='H';gross=0;altgr=0;break;} case'i':{key='I';gross=0;altgr=0;break;} case'j':{key='J';gross=0;altgr=0;break;} case'k':{key='K';gross=0;altgr=0;break;} case'l':{key='L';gross=0;altgr=0;break;} case'm':{key='M';gross=0;altgr=0;break;} case'n':{key='N';gross=0;altgr=0;break;} case'o':{key='O';gross=0;altgr=0;break;} case'p':{key='P';gross=0;altgr=0;break;} case'q':{key='Q';gross=0;altgr=0;break;} case'r':{key='R';gross=0;altgr=0;break;} case's':{key='S';gross=0;altgr=0;break;} case't':{key='T';gross=0;altgr=0;break;} case'u':{key='U';gross=0;altgr=0;break;} case'v':{key='V';gross=0;altgr=0;break;} case'w':{key='W';gross=0;altgr=0;break;} case'x':{key='X';gross=0;altgr=0;break;} case'y':{key='Y';gross=0;altgr=0;break;} case'z':{key='Z';gross=0;altgr=0;break;} case'\n':{key=VK_RETURN;gross=0;altgr=0;break;} } if(altgr==1)keybd_event(VK_RMENU, 0, 0, NULL); if(gross==1)keybd_event(VK_SHIFT, 0, 0, NULL); keybd_event(key, 0, 0, NULL); keybd_event(key, 0, KEYEVENTF_KEYUP, 0); if(gross==1)keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); if(altgr==1)keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0); } if(0==Text.Length()) { keybd_event(' ', 0, 0, NULL); keybd_event(' ', 0, KEYEVENTF_KEYUP, 0); } }die ich von Hellmaster1024_ aus folgendem Beitrag habe.
Was da passiert hab ich verstanden, denk ich. Habe dann dazu eine verschachtelte Schleife geschrieben
void __fastcall TForm1::Button1Click(TObject *Sender) { int b=0; int a=0; for(a;a<=26;a++) { stelle_1=klein[a]; for(b;b<=26;b++) { stelle_2=klein[b]; for(int z=1;z<=26;z++) { Text=stelle_1+stelle_2+klein[z]+"\n"; TextSend(Edit1->Text, Text); } } b=1; } //Rekursiv(); }die auf drei Stellen die möglichen Kombinationen aller Buchstaben, der Funktion übergibt. Diese sendet dann wiederum alles an ein Editor Textdokument.
Mein Problem ist jetzt was am Ende in der .txt steht:bkh
bki
bkj
bkk
bkl
bkm
bkn
bko
bkp
bkq
bkr
bks
bkt
bku
bbk
bbk
bbb
blb
bb
bblbbt
bl
bbmb
bmebbm
bbmbbmbmbbmab hier ist alles verstümmelt bis zzz
. Hat jemand evtl einen Verdacht woran das liegen könnte?
Hab mir schon gedacht das rekursiv zu lösen. Was haltet ihr davon?THX
-
Was ist "klein"? Schon mal mit dem Debugger durch deine Funktion gesteppt und geschaut was eigentlich genau passiert?
-junix
-
klein scheint ein array zu sein in dem das alphabet gespeichert ist.
aber wieso sind klein, stelle_1 und stelle_2 nicht lokal?
brauchst du sie noch an anderer stelle?
und ist es gut seine char-werte so zuzuweisen?
-
sorka schrieb:
[...]scheint [...] zu sein [...] aber wieso [...]?
Genau das ist der Punkt.
-junix
-
in klein sind die Buchstaben abgelegt:
AnsiString klein[27]; klein[0]=""; klein[1]="a"; klein[2]="b"; klein[3]="c"; klein[4]="d"; klein[5]="e"; klein[6]="f"; klein[7]="g"; klein[8]="h"; klein[9]="i"; klein[10]="j"; klein[11]="k"; klein[12]="l"; klein[13]="m"; klein[14]="n"; klein[15]="o"; klein[16]="p"; klein[17]="q"; klein[18]="r"; klein[19]="s"; klein[20]="t"; klein[21]="u"; klein[22]="v"; klein[23]="w"; klein[24]="x"; klein[25]="y"; klein[26]="z";Könnte das auch lokal machen nur bring mir das ja keinen Vorteil, oder?
Mit dem Debugger hab ich noch nicht gearbeitet, werd mich da aber mal dran setzen nur ist es ja seltsam das das Prog. erst so spät Fehler macht. Erst ab "bku" (immer anders) kommt nur noch Datenmüll an. Wär irgendwas mit den Schleifen müsste ja auch schon eher ein Fehler auftreten!
-
musst du das ganze an den editor übergeben???
kannst du es nicht in eine memo schreiben, und dann speichern?also ungefähr so:
AnsiString klein[27]; klein[0]=""; klein[1]="a"; klein[2]="b"; klein[3]="c"; klein[4]="d"; klein[5]="e"; klein[6]="f"; klein[7]="g"; klein[8]="h"; klein[9]="i"; klein[10]="j"; klein[11]="k"; klein[12]="l"; klein[13]="m"; klein[14]="n"; klein[15]="o"; klein[16]="p"; klein[17]="q"; klein[18]="r"; klein[19]="s"; klein[20]="t"; klein[21]="u"; klein[22]="v"; klein[23]="w"; klein[24]="x"; klein[25]="y"; klein[26]="z"; int b=0; int a=0; AnsiString stelle_1, stelle_2; for(a;a<=26;a++) { stelle_1=klein[a]; for(b;b<=26;b++) { stelle_2=klein[b]; for(int z=1;z<=26;z++) { Text=stelle_1+stelle_2+klein[z]; Memo1->Lines->Add(Text); } } b=1; } Memo1->Lines->SaveToFile("C:\\bruteforce.txt"); // <-- davon gehe ich mal aus...
-
Hab jetzt mal einen Haltepunkt für die Variable "Text" gesetzt und die Schleife vorher (hab mich langsam hoch gearbeitet) ca. 5000 durchlaufen lassen ("Breakpoint poroperties"\"Passcount")
Text=stelle_1+stelle_2+klein[z]+"\n"; TextSend(Edit1->Text, Text);das interessante dabei ist das jetzt erst ab ca. "hxf" nur noch Müll ankommt. Wenn ich die Schleife nach dem anhalten noch 2000 mal weiter laufen lasse, dann macht das Prog. auch keine Fehler mehr.
Hab mir jetzt gedacht das ich evtl soetwas wie eine delay() einbauen könnte, weil das Debuggen ja sicherlich auch den Ablauf des Programms verlangsamt. Was haltet ihr davon?
-
Klar könnte ich das auch an ein Memo übergeben nur wär es ja sinnlos weil ich ja auf ein anderes Prog zugreifen will oder meinst du das ich dann die Text Datei (in der alle Kombinationen stehen) zu laufzeit des Progs einlese und dann Zeile für Zeile die Strings übertrage? (dann wären evtl 2 der Schleifen überflüssig)
-
Warum so umstaendlich?
geht das nicht so:
. . . AnsiString TextKlein="xyz"; for (TextKlein[1]=`a`;TextKlein[1]<=`z`;TextKlein[1]++) for (TextKlein[2]=`a`;TextKlein[2]<=`z`;TextKlein[2]++) for (TextKlein[3]=`a`;TextKlein[3]<=`z`;TextKlein[2]++) TextSend(Edit1->Text, TextKlein); . . .???
-
Hab das Problem gelöst. Falls es jemand wissen will, es lag an der Geschwindigkeit des Programms. Hab jetzt einen break von einer Millisekunde eingebaut und alles läuft wie es soll

Sleep(1); TextSend(Edit1->Text, Text);wollte mich noch bedanken für den Link zu dem Debugger Tutorial. Jetzt weiß ich entlich mal wie das geht
so ein bischen jedenfalls.
Kann es auch nicht verstehen das dieses Thema an den meisten Schulen nicht angesprochen wird obwohl er einem die Arbeit ziemlich erleichtern kann.THX