Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi In Fremdanwendung Informationen anzeigen (https://www.delphipraxis.net/117861-fremdanwendung-informationen-anzeigen.html)

Coder1990 26. Jul 2008 17:58


In Fremdanwendung Informationen anzeigen
 
Hi,

folgendes Problem:
Ich bin gerade dabei ein Programm zu schreiben dass auf Tastendruck (abgefangen durch einen globalen Hook) in einer Vollbild - Anwendung und oder Desktop eine Textinformation anzeigen soll.

Beispiel:
Ich bin gerade in Warcraft und drücke "i" dann soll oben rechts, in der ecke des bildschirms, die aktuelle uhrzeit angezeigt werden, vll noch 3 sekunden vorhanden bleiben (digital, soll während den drei sekunden weiterzählen) und dann wieder verschwinden.

Fragestellung:
Wie realisiere ich so eine Textanzeige? (vgl Wc3 Banlist, falls das jemand kennt)

btw Ich habe die Suche benutzt habe aber nicht gewusst nach welchen Stichworten ich suchen soll

MfG

new32 26. Jul 2008 18:27

Re: In Fremdanwendung Informationen anzeigen
 
Delphi-Quellcode:
FormName.ParentWindow:=ZielWnd;
damit lässt sich ein Fenster in ein anderes integriert.

Matze 26. Jul 2008 18:32

Re: In Fremdanwendung Informationen anzeigen
 
Bei Overlay-Anwendungen ist dies jedoch alles andere als einfach. Dazu gibt es zahlreiche Themen doch eine Antwort konnte ich auf Anhieb keine finden: Hier im Forum suchenDirectX Overlay, dafür umso mehr Leute, die sich ebenfalls für eine Lösung interessieren.

toms 26. Jul 2008 19:12

Re: In Fremdanwendung Informationen anzeigen
 
Hallo, ein Beispiel in C++ findet man hier:
[C++] Direct3D hooking sample

Coder1990 26. Jul 2008 21:13

Re: In Fremdanwendung Informationen anzeigen
 
Zitat:

Zitat von new32
Delphi-Quellcode:
FormName.ParentWindow:=ZielWnd;
damit lässt sich ein Fenster in ein anderes integriert.

ist glaub ich nicht das, was ich suche .. ich will ja auch in vollbild anwendungen (spiele) diese informationen anzeigen :cyclops:

Zitat:

Zitat von Matze
Bei Overlay-Anwendungen ist dies jedoch alles andere als einfach. Dazu gibt es zahlreiche Themen doch eine Antwort konnte ich auf Anhieb keine finden: Hier im Forum suchenDirectX Overlay, dafür umso mehr Leute, die sich ebenfalls für eine Lösung interessieren.

Hab mir den MadCodeHook mal angesehen .. (Sonst fand ich da auch keine potentielle Lösung) .. wobei ich aber 1. keine Ahnung habe wie ich Api Hook installiere/benutze/deinstalliere und 2. ungern fremde Packages verwende (fremde Units nehme ich) komm ich da auch nicht weiter.. :pale:

Zitat:

Zitat von toms
Hallo, ein Beispiel in C++ findet man hier:
[C++] Direct3D hooking sample

Leider kann ich kein C++ (auch wenn ichs schon lang lernen wollte :mrgreen:)

falls jemand vll eine direkt Lösung findet wäre ich sehr dankbar, es soll ja auch keine permanente Einblendung sein, sondern nur halt kurz die Uhrzeit anzeigen..

MfG

Coder1990 27. Jul 2008 10:32

Re: In Fremdanwendung Informationen anzeigen
 
Habe mich jetzt für die einfachste, wie auch wahrscheinlich unschönste Methode entschieden: Ich male den Text mit einem TCanvas auf das entsprechende Windows:

Delphi-Quellcode:
procedure WriteText(TransText: string;x,y:integer);
var
  MyHand: HWND;
  MyDc: HDC;
  MyCanvas: TCanvas;
  Start : Longint;
begin
MyHand := GetForegroundWindow;
MyDc := GetWindowDC(MyHand);
MyCanvas := TCanvas.Create;
MyCanvas.Handle := MyDC;
BeginPath(MyCanvas.Handle);
MyCanvas.Font.Color := clred;
MyCanvas.Font.Name := 'Arial';
MyCanvas.Font.Size := 15;
SetBkMode(MyCanvas.Handle,TRANSPARENT);
EndPath(MyCanvas.Handle);
MyCanvas.TextOut(x,y, TransText);
Start := GetTickCount;
repeat
MyCanvas.TextOut(x, y, TransText);
Application.ProcessMessages
until (GetTickCount - Start > 3000);
InvalidateRect(0,nil, true);
end;
// die Procedure dürfte wohl dem einen oder anderen bekannt sein ;)

Zu meinen Fragen:
1. Bei mir wird der erzeugte Text nach 3 Sekunden nicht gelöscht, habe schon versucht ein Trect einzubauen dass den Text beinhaltet und dieses dann bei "InvalidateRect" einzubauen.. hat auch nicht funktioniert. Was mache ich falsch?
//edit: Funktioniert plötzlich -.-, wäre es nicht besser nur die Position des Textes zu Aktualisieren, weil der komplette Refresh Vorgang is auch bissl unschön

2. Der Benutzer soll bei meinem Programm auswählen auf welcher Bildschirmposition der Text erzeugt werden soll und ich habe Probleme dass Window an dieser Stelle zu finden..

MfG

toms 27. Jul 2008 10:51

Re: In Fremdanwendung Informationen anzeigen
 
Zitat:

und ich habe Probleme dass Window an dieser Stelle zu finden..
Was genau meinst du damit?

Coder1990 27. Jul 2008 11:13

Re: In Fremdanwendung Informationen anzeigen
 
Also ich möchte 2 Optionen implementieren eine Fensterabhänhige und eine unabhängige (Die Abhänhige kann ich ja mit GetForegroundWindow klären). Nun zur unabhängigen:
Der Benutzer stellt in meinem Programm eine Position für die Anzeige der Information ein z.b. irgendwo oben links.. nun muss ich irgendwie das Fenster, dass gerade dort ist, ermitteln - es muss ja nicht das ForegroundWindow sein..

toms 27. Jul 2008 11:15

Re: In Fremdanwendung Informationen anzeigen
 
:arrow: MSDN-Library durchsuchenWindowFromPoint
Zitat:

The WindowFromPoint function retrieves a handle to the window that contains the specified point.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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