Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Button in anderer Anwendung (https://www.delphipraxis.net/158316-button-anderer-anwendung.html)

Delphi-Checker 13. Feb 2011 10:48


Button in anderer Anwendung
 
Hallo, ich versuche krampfhaft den Status eines Button in einer
andren Anwendung zu ermitteln. Das Handle des Buttons habe ich,
und ein ansprechen des Buttons mit
Delphi-Quellcode:
SendMessage(wndChild,BM_CLICK,0,0)
bring auch den gewünschten Erfolg.
Die Abfragen zum Status des Buttons bringen keinen Erfolg.

Delphi-Quellcode:
 Style := getWindowLong(wndMain, gwl_style);
 if (Style and WS_DISABLED) <> WS_DISABLED then ...// kein Ergebniss
und

Delphi-Quellcode:
 if (SendMessage(wndChild,BM_GETSTATE,0,0) and BST_PUSHED) = BST_PUSHED then... //kein Ergebniss


Vieleicht hat ja noch jemand eine Idee, woran das liegen kann.

Gruss Jörg

WM_CLOSE 13. Feb 2011 11:00

AW: Button in anderer Anwendung
 
was sagt denn GetLastError?

Delphi-Checker 15. Feb 2011 00:22

AW: Button in anderer Anwendung
 
GetLastError gibt in beiden Fällen keinen Fehler aus.
Beim ersten Aufruf erhalte ich immer WS_ENABLED zurück,
und bei der zweiten Abfrage bekomme Ich immer 0 zurück.

jfheins 15. Feb 2011 11:34

AW: Button in anderer Anwendung
 
Zitat:

Style := getWindowLong(wndMain, gwndMainwl_style);
Vielleicht ist das der Fehler ;)

Delphi-Checker 15. Feb 2011 13:55

AW: Button in anderer Anwendung
 
Entschuldige bitte, da habe ich mich verschrieben.
Es heist bei mir natürlich
Delphi-Quellcode:
Style := getWindowLong(wndChild, gwl_style);
if (Style and WS_DISABLED) <> WS_DISABLED then ...// kein Ergebniss
Wie gesagt, erhalte ich auch einen Wert zurück,
der jedoch egal wie der Button aussieht immer enabled ist.

DeddyH 15. Feb 2011 14:00

AW: Button in anderer Anwendung
 
Hast Du es einmal mit IsWindowEnabled versucht?

Delphi-Checker 15. Feb 2011 14:23

AW: Button in anderer Anwendung
 
IsWindowEnabled bringt auch immer nur True.
Ich bin am verzweifeln!

DeddyH 15. Feb 2011 14:32

AW: Button in anderer Anwendung
 
Merkwürdig, ich habe das gerade einmal ausprobiert, bei mir geht das einwandfrei :gruebel:

WM_CLOSE 15. Feb 2011 14:35

AW: Button in anderer Anwendung
 
Was ist denn das für eine "Anwendung". Kann es sein, dass sie die Windows-Eigenschaft WS_ENABLED gar nicht antastet?
Versuch mal mit dem dem Programm die Eigenschaft auzulesen: http://mh-nexus.de/en/downloads.php?product=PropEdit

Delphi-Checker 15. Feb 2011 14:41

AW: Button in anderer Anwendung
 
Ich habe das mal mit einer Dummy-Anwendung ausprobiert.
Das Handle des Buttons habe ich mit WinSpy++ geholt und es funktioniert!
Ich glaube mein Problem liegt an dem Handle des Buttons.
Komisch aber das ich den Button über SendMessage ansprechen kann.
Danke für den Link, werde Heute Nacht auf Arbeit noch einmal
ein paar Versuche machen (Habe die Anwendung nicht zu Hause).
Werde mich Morgen mal dazu melden.

Grüße Jörg

EWeiss 15. Feb 2011 14:44

AW: Button in anderer Anwendung
 
Lustig..
BN_CLICKED kommt erst an wenn der Button losgelassen wird

Kein wunder das dein ergebnis immer 0 ist.

gruss

Delphi-Checker 17. Feb 2011 04:46

AW: Button in anderer Anwendung
 
Liste der Anhänge anzeigen (Anzahl: 4)
Habe jetzt 2 Nächte über der Sache gehockt, und bin zu der Erkenntniss gekommen
das WM_Close da schon eine Ahnung hatte.
Das Control ist zwar ein Button, doch ihm fehlen einige Eigenschaften,
so das man es zwar ansprechen kann aber von Ihm keine Informationen über de Status zurück bekommt.
Ich habe im Anhang mal ein Paar Screenshots von Spy++, vieleicht hat ja jemand noch eine Idee
wie man an den Status eines solchen Buttons herankommt.

WM_CLOSE 17. Feb 2011 07:08

AW: Button in anderer Anwendung
 
Es wäre wichtiger, wenn du uns den Unterschied zwischen Enabled und disabled zeigst.
Ich habe aber die Vermutung, dass das so etwas wie ein SpeedButton ist, der nicht die Windows Version von Enabled/Disabled benutzt, sondern nur jeweils ein anderes Bitmap drüber blendet. Damit kann mann z.B. ungewünschte Effekte unter anderen OS-Versionen vermeiden und das Programm sieht überall gleich aus. Das Programm das ich oben verlinkt habe zeigt das normalerweise zuverlässig an. (Ist das normal, dass sich WinSpy++ aufhängt??).

Vielleicht ist es auch einfacher (QAD) :twisted: einfach nur das Fenster in den Vordergrund zu holen und dann die Farbe an der Position des Buttons zu merken.

turboPASCAL 17. Feb 2011 08:55

AW: Button in anderer Anwendung
 
Vill. macht ihr euch das zu schwer und das Programm hat eine Programierer-Schnittstelle.
Dann könnte man an dieser Stelle ansetzen.

WM_CLOSE 17. Feb 2011 09:04

AW: Button in anderer Anwendung
 
turboPASCAL hat Recht:
solange wir nicht wissen, wie das Programm aufgbaut ist, bzw was das für ein Programm ist können wir relativ wenig helfen.

Eine Dll oder so würde das ganze stark vereinfachen

PS:Ist das Programm u.U in einer .Net-Sprache entwickelt?

Delphi-Checker 17. Feb 2011 20:24

AW: Button in anderer Anwendung
 
Ich habe gerade noch einmal mit PropEdit die Anwendung gecheckt,
da wird mir über den Compiler oder die Sprache nichts mitgeteilt.
Ich glaube da weiter zumachen hat wenig Sinn allerdings würde ich gerne die Idee
von WM_CLOSE aufgreifen und über die Farbe im Button den Status zu ermitteln.
Leider habe ich absolut keinen Plan.
Wie ermittle ich die Position des Buttons und wie komme ich an die Farbe?

Gruß Jörg

WM_CLOSE 17. Feb 2011 21:19

AW: Button in anderer Anwendung
 
Delphi-Quellcode:
var
  hButton   :THandle;
  ButtonRect :_Rect;//das ist ein c-Typ //evtl auch nur Rect
  Farbe     : TColor;//????
  bit       : TBitmap;//TODO: schauen, ob Graphics.TBitmap oder Windows.Bitmap
  can       : TCanvas;
begin
  res:=GetWindowRect(hButton, @ButtonRect);//vllt ohne @
  posx := (ButtonRect.Left + ButtonRect.Right) div 2;
  posy := (ButtonRect.Top + ButtonRect.Bottom) div 2;
  can.Handle := GetWindowDC(0);
  try
    bit := TBitmap.Create;
    try
      bit.Width := Screen.DesktopWidth;
      bit.Height:= Screen.DesktopHeight;
      bit.PixelFormat := pfDevice;
      BitBlt(bit.Canvas.Handle,
             0,
             0,
             Pred(Screen.DesktopWidth),
             Pred(Screen.DesktopHeight),
             can.Handle,
             Screen.DesktopLeft,
             Screen.DesktopTop,
             bit.Canvas.CopyMode);
      Farbe:=bit.Canvas.Pixels[posx,posy]//<--geändert
    finally
      bit.Free;
    end;
  finally
    ReleaseDC(0, can.Handle);
  end;
end;
k.A ob das funktioniert. im Zweifelsfall nach jedem API aufruf ein GetLastError.

PS: bei dem Ansatz wirst du Probleme mit mehreren Monitoren kriegen

Delphi-Checker 17. Feb 2011 21:50

AW: Button in anderer Anwendung
 
Dank für die schnelle Hilfe. Anwendung läuft nur auf einem Bildschirm,
deshalb könnte diese Variante funktionieren.
Bekomme leider einen Fehler bei: bit.Pixels!

rollstuhlfahrer 17. Feb 2011 22:03

AW: Button in anderer Anwendung
 
das sollte heißen:
Delphi-Quellcode:
Bit.Canvas.Pixels[]
Bernhard

Delphi-Checker 19. Feb 2011 00:24

AW: Button in anderer Anwendung
 
Habe erstmal die Variante mit der Abfrage der Farbe des Buttons gewählt,
funktioniert einwandfrei. Danke für Eure Hilfe!

Gruss Jörg


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