AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Ich finde keine ChildHandles beim TSaveDialog ...
Thema durchsuchen
Ansicht
Themen-Optionen

Ich finde keine ChildHandles beim TSaveDialog ...

Ein Thema von FriFra · begonnen am 19. Aug 2005 · letzter Beitrag vom 1. Mai 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#11

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 10:19
So, jetzt hab ich die verschiednen Tips kombiniert und hab die IMHO beste Lösung gewfunden

Delphi-Quellcode:
  wnd := FindWindow('#32770',PChar(SaveDialog1.Title));
  wnd := GetDlgItem(wnd, 1148);
  if wnd <> 0 then
  begin
    showmessage('// ....gefunden!');
  end;
Der Vorteil wenn man über die ItemID geht liegt darin, dass man jetzt sogar die Captions der Buttons und Labels ändern kann
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 10:23
@Frifra: Wer sagt dir aber dass, das handle was dir findwindow zurück gibt auch wirklich von deinem dialog ist und nicht das handle eines fensters aus einer anderen anwendung?

wenn ich folgendes auf meinem Rechner ausführe bekomme ich 4 handles in meiner Listbox was also auch heißt das es 4 Fenster mit dem Classname gibt. Somit wäre deine Variante nicht sehr zuverlässig.
Delphi-Quellcode:
var LHandle: Cardinal;
    LStr: PChar;
begin
  LStr := StrAlloc(255);
  LHandle := FindWindow('#32770', nil);
  while (LHandle <> 0) do
  begin
    GetClassName(LHandle, LStr, 254);
    if LStr = '#32770then
      ListBox1.Items.Add(inttostr(LhANDLE));
    LHandle := GetWindow(LHandle, GW_HWNDNEXT);
  end;
  StrDispose(LStr);
end;
bei der variante von Toms ist es auch nicht anders, da kann es ganauso passieren das man entweder kein handle zurück bekommt oder das von einem anderen dialog.

Wenn du das ganze wie folgt erweiterst kannst du wenigstens sicherstellen dass, das gefundene Fenster zu deiner Anwendung gehört:
Delphi-Quellcode:
var LHandle: Cardinal;
    LStr: PChar;
begin
  LStr := StrAlloc(255);
  LHandle := FindWindow('#32770', nil);
  while (LHandle <> 0) do
  begin
    GetClassName(LHandle, LStr, 254);
    if LStr = '#32770then
    begin
      if GetWindow(LHandle, GW_OWNER) = Application.Handle then
        EnumChildWindows(LHandle, @EnumProc, 0);
    end;
    LHandle := GetWindow(LHandle, GW_HWNDNEXT);
  end;
  StrDispose(LStr);
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#13

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:10
Zitat von SirThornberry:
@Frifra: Wer sagt dir aber dass, das handle was dir findwindow zurück gibt auch wirklich von deinem dialog ist und nicht das handle eines fensters aus einer anderen anwendung?
Das es tatsächlich "mein" Dialog ist, ist durch die Angabe der Caption im FindWindow sichergestellt, da diese Caption bei mir eindeutig ist
wnd := FindWindow('#32770',PChar(SaveDialog1.Title)); Ich hab aber gerade festgestellt, das es beim Überschreiben der Buttoncaptions Probleme gibt...
Delphi-Quellcode:
var
  wnd: HWND;
  Tmp: string;
  Buffer: array[0..MAX_PATH] of Char;
  n: integer;
begin
  wnd := FindWindow('#32770', PChar(SaveDialog1.Title));
  wnd := GetDlgItem(wnd, 1);
  if wnd <> 0 then
  begin
    GetWindowText(wnd, Buffer, MAX_PATH);
    Tmp := 'Teest';
    if StrPas(Buffer) <> Tmp then
      SetWindowText(wnd, PChar(Tmp));
  end;
Mache ich das ganze im onShow, wird die Caption von Windows sofort wieder überzeichnet... lagere ich das ganze in einen Timer mit kurzem Interval aus, so hat mam bei jeder Dateiauswahl (-> Neuzeichnen des gesamten Dialoges) ein "lustiges Blinkespiel", weil jedesmal wieder kurz die Originalcaption zu sehen ist
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:14
reicht es nicht das du einmal die caption setzt und dann den timer abschaltest?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#15

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:22
Nein, sobald man z.B. eine Datei auswählt, werden alle Buttoncaptions neu gezeichnet... natürlich wieder mit den originalwerten
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:25
da du die handles der Buttons hast könntest du die Windowproc umlenken und die messages zum setzen der Caption einfach verwerfen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#17

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:29
Und wie mach ich das?

Wenn ich das hinbekäme könnte ich endlich mal alle Captions der Standardialoge ändern, was für mehrsprachige Anwendungen sehr gut ist
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 11:31
komich, ich hab grad mal die buttoncaption für "öffnen" geändert und diese wurde nicht zurück geändert als ich eine Datei gewählt habe oder den Ordner gewechselt. Wie man die Windowproc umbiegt - ich bastels mal schnell zamm

[Edit]
So wirds gemacht
Delphi-Quellcode:
//variable für die alte windowproc
var GOldProc: function(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall;

//unsere neue Windowproc
function NewWindowProc(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall;
begin
  result := GOldProc(AHandle, uMsg, AWParam, ALParam);
end;

[...]
//umbiegen auf neue windowproc und sichern der alten für inherited call
Integer(@GOldProc) := SetWindowLong(LHandle, GWL_WNDPROC, Integer(@NewWindowProc));
[...]
in der NewWindowProc kannst du dann wm_settext verwerfen bzw. abändern
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#19

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 12:05
Bei "Integer(@NewWindowProc)" kommt bei mir immer der Fehler "Variable erforderlich"...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Ich finde keine ChildHandles beim TSaveDialog ...

  Alt 20. Aug 2005, 12:08
dann versuch mal ob es geht wenn du das "@" wegmachst, unter d5 ging es ohne "@" wenn ich mich recht entsinne, mein Delphi7 hingegen meckert rum. Ansonsten kannst du den Cast auch um den anderen Teil machen (also auf den Proceduretype casten)

also so:
Delphi-Quellcode:
type
  TWindowproc = function(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall;
[...]
var GOldProc: TWindowProc;
[...]
GOldProc := TWindowProc(SetWindowLong(LHandle, GWL_WNDPROC, Integer(@NewWindowProc)));
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 20:24 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