AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung von fremdem Programm abfragen

Ein Thema von napsterxx · begonnen am 14. Aug 2007 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#1

Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 18:07
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?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 19:05
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 19:34
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...
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 20:17
Zitat von napsterxx:
haste eine nähere beschreibung zu Get...
Du meinst wohl getDC. Das sind alles WinAPI-Funktionen, schau mal bei MSDN. Grob gesagt läuft es darauf hinaus, dass du dir die Zeichenfläche des gesamten Desktops holst.
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 20:46
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?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 20:55
Zitat von napsterxx:
für 15 Jahre ganz schön gut
Danke

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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 21:04
ok dann mal chat^^ bloß wo finde ich den chat?

//EDIT
gefunden^^
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 14. Aug 2007, 22:27
also das prinzip verstanden bloß kp wie ich es anwenden soll^^ wäre einer so gut mir zu helfen?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 15. Aug 2007, 13:21
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:
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;
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.
Große Teile dieses Hooks stammen aus Assarbads Tutorial hier, ich habe dann einfach verwiesen.

In der DLL steht ungefähr folgender Code:
Delphi-Quellcode:
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
Bei weiteren Fragen entweder hier im Forum oder im Chat.
Grüße
Apollonius
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 19. Aug 2007, 14:20
Was um einiges einfacher ist:
http://dsdt.info/tipps/?id=201

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?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz