![]() |
Fehlermeldung von fremdem Programm abfragen
Also vielleicht kennen einige von euch GG Client. Man kann einen Raum betreten und dann ein Spiel starten. Jeder Raum kann bis zu 225 User haben. Wenn 225 User im Raum sind, dann kann niemand mehr rein bis einer deiesen verlässt. Ich wollte ein tool coden, was so lang probiert den Raum zu betreten bis man drin ist. wenn der raum voll ist, und man probiert ihn durch doppelklick zu joinen, dann kommt eine fehlermeldung. wenn man ihn betreten kann kommt keine. ich bin soweit, das ich mit einem hotkey (F2) drücke und dann delphi ein "Doppelklick" auf den Raum macht, und danach "Return-Tastendruck simuliert" um die eventuelle Fehlermeldung weg zu drücken.
Nun muss man natürlich auch 100mal F2 drücken bis man drin ist. Ich wollte alles in eine schleife bauen, und diese soll immer nach dem doppelklick überprüfen ob die Fehlermeldung "der Raum ist voll" erscheint oder nicht. Erscheint sie, dann soll mein tool erst "Return simulieren" dass die Fehlermeldung verschwindet, und dann erneut doppelklick und überprüfen ob die fehlermeldung kommt. Kommt sie nicht, soll die prozedur abgebrochen werden. Aberwie überprüfe ich nun ob eine fehlermeldung kommt? |
Re: Fehlermeldung von fremdem Programm abfragen
Ist wahrscheinlich nicht die geschickteste Variante, aber ich würde es so machen, wie es der Benutzer auch macht: Schauen, ob auf dem Bilschirm was steht. Dazu holst du dir mit getDC(0) den Devicecontext des Desktops und wendest darauf getPixel(dc, XKoord, YKoord) an. Nun kannst du prüfen, welche Farbe an dem spezifischen Bildschirmfleck dargestellt wird. Vorher musst du natürlich prüfen, wie die Farben mit und ohne Fehlermeldung sind. Dann kannst du unterscheiden. Am Ende releaseDC nicht vergessen!
Hoffe geholfen zu haben Apollonius |
Re: Fehlermeldung von fremdem Programm abfragen
naja das wäre eine möglichkeit, aber was wenn der user eine andere bildschirm auflösung hat? dann ist doch die fehlermeldung wo anders ...haste eine nähere beschreibung zu Get...
|
Re: Fehlermeldung von fremdem Programm abfragen
Zitat:
Bei der Auflösung... Tja, du könntest darauf spekulieren, dass das Fenster immer in der Mitte ist. Aber ich habe schon gesagt, dass die Variante alles andere als optimal ist, das Fenster darf z.B. nicht verdeckt werden... Du könntest irgendwas mit Messages probieren, mir fällt gerade ein WH_CallMsgProcRet-Hook ein, mit dem man WM_CREATE abfängt, sich mit WM_GETTEXT den Titel holt und auf den Titel der Fehlermeldung prüft... Ich habe es gerade getestet, es funktioniert wirklich. Ein WH_Shell-Hook (an den hatt ich erst gedacht) wirkt nur auf "unowned windows", sodass der WH_CallMsgProcRet-Hook nötig ist. Diese Vorgehensweise sollte funktionieren. |
Re: Fehlermeldung von fremdem Programm abfragen
Ollala also da hab ich gar icht verstanden ;) für 15 Jahre ganz schön gut ^^ kannste vll auch das ein bissel näher erklären?
|
Re: Fehlermeldung von fremdem Programm abfragen
Zitat:
Kennst du dich mit Windows-Nachrichten aus? Sonst muss ich etwas weiter ausholen. @PN: Leider bin ich in keinerlei INet-Kommunikation außer der DP aktiv. Zur Not kann ich dir das Thema im DP-Chat nahebringen. |
Re: Fehlermeldung von fremdem Programm abfragen
ok dann mal chat^^ bloß wo finde ich den chat?
//EDIT gefunden^^ |
Re: Fehlermeldung von fremdem Programm abfragen
also das prinzip verstanden bloß kp wie ich es anwenden soll^^ wäre einer so gut mir zu helfen?
|
Re: Fehlermeldung von fremdem Programm abfragen
Das Programm besteht aus einer DLL - unbedingt nötig für den Hook - und dem Hauptprogramm mit der Schleife. Das Hauptprogramm sieht dann ungefähr so aus:
Delphi-Quellcode:
Die DLL muss folglich die Funktionen HookInstallieren, Hookdeinstallieren, ResetDLL und Fehlererschienen exportieren. Die letzten beiden Funktionen brauchen wir, da DLLs keine Variablen exportieren können, wir müssen den Zugriff daher kapseln.
procedure Proc;
begin HookInstallieren(Application.Handle); repeat ResetDLL; //Variable "FehlerErschienen" auf False setzen TryEnterRoom; Delay(10); //Verringert CPU-Auslastung und gibt dem anderen Programm die Möglichkeit, die Fehlermeldung anzuzeigen if not FehlerErschienen then //Erfolg break; FehlermeldungWegKlicken; until getkeystate(VK_ESCAPE); //nötig für nutzerseitigen Abbruch HookDeinstallieren; end; Große Teile dieses Hooks stammen aus Assarbads Tutorial ![]() In der DLL steht ungefähr folgender Code:
Delphi-Quellcode:
Bei weiteren Fragen entweder hier im Forum oder im Chat.
var Fehler:boolean;
HookHandle: cardinal=0; //Siehe Assarbads Tutorial WindowHandle:cardinal=0; //Siehe Assarbads Tutorial function MyHookFunc(nCode: integer; wParam: wparam; lParam: lparam):LRESULT; stdcall; var Buf:array[0..255] of char; //Fenstertext-Puffer begin if nCode=HCBT_CREATEWND then //geht es um Erstellung eines Fensters? begin sendmessage(wParam, //Handle des neuen Fensters WM_GETTEXT, //Wir wollen den Fenstertext 255, //Die Länge des Puffers integer(@buf[0]));//Zeiger auf das erste Zeichen im Puffer if Buf='Inhalt der Fehlermeldung' //Ist dies das gesuchte Fehlermeldungsfenster? Fehler:=true; end; CallNextHookEx(HookHandle, nCode, wParam, lParam); //in jedem Fall Callnexthookex aufrufen! end; procedure resetDLL; //Kapselung von Variablenzugriff begin Fehler:=false; end; function Fehlererschienen:boolean; //ebenso begin result:=Fehler; end; function Hookinstallieren(Hwnd: Cardinal): Boolean; //Siehe Assarbads Tutorial; aber den richtigen Hook-Typ (WH_CBT) verwenden! function HookDeinstallieren:boolean; //Siehe Assarbads Tutorial Grüße Apollonius |
Re: Fehlermeldung von fremdem Programm abfragen
Was um einiges einfacher ist:
![]() Erst alle Fensternamen in eine Listbox einlesen. Dann die Adresse vor den Fensternamen entfernen. Nun die Listbox nach dem Fensternamen der Errorbox durchsuchen. Gibt es diesen Namen in der Liste wird die Prozedur erneut probiert. Gibt es sie nicht, dann wird die Prozedur abgebrochen ;) Sehr viel einfacher oder? |
Re: Fehlermeldung von fremdem Programm abfragen
Warum einfach, wenn es auch kompliziert geht? :???:
Ich habe zufälligerweise eben gerade mein Projekt mit dem Hook fertiggestellt. Es war dann doch nicht so trivial (!?), wie ich gedacht hatte, ich musste mich noch in Mailslots einarbeiten, aber ich habe einiges gelernt. Soll ich mein Projekt mal hochladen oder reicht dir der einfache Weg? (grins) [edit] Tja, ein guter WinAPI-Programmierer sollte vielleicht nicht nur wissen, wie man etwas machen kann, sondern auch, wie man es am einfachsten macht. [/edit] [edit] EnumWindows wird nicht funktionieren, da es laut MSDN nur "top-level-windows" angibt. Da wirst du wohl andere Tricks brauchen, entweder meinen Weg :cyclops: oder ein Findwindow kombiniert mit entweder Findwindowex oder, wenn du es kompliziert willst, enumChildWindows. |
Re: Fehlermeldung von fremdem Programm abfragen
xD bei mir funktioniert das tadellos.
Hier mal mein Code:
Delphi-Quellcode:
var
x, y: Integer; begin Memo1.Lines.Delete(9); i := i+1; Memo1.Lines.Add(inttostr(i)+' trys to get in a room ;)'); Memo1.Lines.Delete(11); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); // Doppelklick auf den Raum mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); sleep(1000); //Kurz warten sodass die Fehlermeldung erscheinen kann wenn der Raum voll ist Button2.Click; //Dann Button2 klicken um zu überprüfen ob die Fehlermeldung kam oder nicht if Edit1.Text = 'found' then //Dann Enter drücken um die Fehlermeldung zu "entfernen" begin keybd_event(VK_Return,0,0,0); Button1.Click; //und erneut die Przedur ausführen end; end;
Delphi-Quellcode:
Vielleicht umständlich geschrieben^^
procedure TForm1.Button2Click(Sender: TObject);
var Count , Count1, i, i1 :integer; s : string; begin Listbox1.Clear; EnumWindows(@EnumWinProc, 0); //Alle Fensternamen in Listbox1 schreiben Count := Listbox1.Items.Count-1; Listbox2.Clear; for i := 0 to Count do begin s := Listbox1.Items.Strings[i]; delete(s, 1, 9); //Da vor jedem namen noch die Adresse steht diese löschen Listbox2.Items.Add(s); //Nun den namen ohne adresse in Listbox2 schreiben end; Listbox3.Clear; for I := 0 to Count do begin if Listbox2.Items.Strings[i] = 'GG Gaming Client Beta 1.6' then //Dort nach dem Fensternamen suchen, welchen die Fehlermeldung trägt begin Edit1.Text := 'found'; //Wenn gefunden dann found in Edit1 schreiben und bei button1 weiter machen end; end; end; //EDIT1 hier mal eine liste von allen Fensternamen die angezeigt werden:
Delphi-Quellcode:
//EDit2
020086 : Startmenü
010082 : CiceroUIWndFrame 08021E : CodeParamWindow 0100DC : CiceroUIWndFrame 0200A6 : TF_FloatingLangBar_WndTitle 05051E : Forcer - K1ngC0bra 0804D2 : Forcer 190262 : Struktur 1D025E : Modellansicht 0507EC : Benachrichtigung über Debugger-Problem 030244 : Unit1.pas-Darstellung 0104A6 : Übersetzungswörterbuch 0E021A : HelpInsightWindow 0103C8 : Datenbank-Engine-Fehler 02033C : Forcer - Borland Delphi 2005 for Microsoft Windows - Unit1 [Ausführen von] 010504 : EditorStatusControlForm 010330 : Debug 020324 : Übersetzungswörterbuch 02031C : Schriftart wählen 01031A : Suchergebnisse 02035C : IDEToolbarForm 01036A : Meldungen der Versionskontrolle 01037E : IDEToolbarForm 030304 : Suchen 0102EC : Forcer - Borland Delphi 2005 for Microsoft Windows - Unit1 [Ausführen von] 020684 : GGTV 0206A0 : GGTV 020546 : BNet Ping 020558 : GGTV Player 02063A : Ladder Game Start 020602 : Dialog 020712 : Search a user 0701C2 : GG E-Sports Platform Beta 1.6 02055A : CTrayNotifyIcon Resurrection Notification Window 0601EA : CTrayNotifyIcon Resurrection Notification Window 0401A6 : CTrayNotifyIcon Animation Notification Window 0801CC : Message Manager 0402B2 : Delphi-PRAXiS :: Beitrag editieren - Mozilla Firefox 0601D6 : Socket Notification Sink 020220 : KibitzWindow 0302B4 : XPCOM:EventReceiver 0D0266 : NetscapeDispatchWnd 090284 : XPCOM:EventReceiver 020296 : DBK 020298 : BORDBK90 0401F4 : MCI command handling window 0101DA : ICQ 02035E : .NET-BroadcastEventWindow.1.0.5000.0.20 030338 : WindowsFormsParkingWindow 010368 : DDE Server Window 0102C8 : CTicketManagerWnd 0102CC : DDE Server Window 0101E6 : NVSVCPMMWindowClass 010162 : Connections Tray 010154 : Energieanzeige 01014E : MS_WebcheckMonitor 0300C0 : BitTorrent DNA 2.0 Beta 0100FA : PrivoxyTrayWindow 0100F6 : Privoxy 0100F4 : PrivoxyLogOwner 0100CC : keyboard 0100AE : mouse 04005A : WindowBlinds 0100E4 : GDI+ Window 01011C : GDI+ Window 01017A : Script Console 0402D0 : Boxely:TimerWindow 0101A0 : vidalia 010176 : Tor Network Map 010174 : Tor Bandbreitenbenutzung 010172 : Nachrichtenprotokoll 01016C : vidalia 01016A : Vidalia Kontroll-Panel 02037A : GDI+ Window 0302DE : SysFader 010084 : Program Manager kannste in Chat kommen? |
Re: Fehlermeldung von fremdem Programm abfragen
Wäre es nicht viel einfacher, wenn du den Code von dsdt etwas modifizieren würdest, anstatt dich da mit der vorgeschriebenen Listbox rumzuquälen?
Dein Ansatz funktioniert auch, wenn keine Fehlermeldung kommt? Das würde mich nämlich irritieren, da dazu die Fehlermeldung ein top-level-Fenster ohne Owner sein müsste, was sehr unüblich wäre... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz