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 Eine komponente einer anderen Applikation anektieren (https://www.delphipraxis.net/151633-eine-komponente-einer-anderen-applikation-anektieren.html)

gibb 26. Mai 2010 07:03


Eine komponente einer anderen Applikation anektieren
 
Hallo zusammen,

Im thema ein Explizites tasten Event wurde leider keine wirklich zufriedenstellende lösung für mein Problem mit den tastenevents gefunden. Daher hier ein neuer ansatz resp. eine Frage.

Ist es möglich ein Editfeld einer beliebigen applikation über z.b. den Handle zu anektieren und eine referenz im eigenen code zu erstellen? So das ich in das ich das edit direkt befüllen kann OHNE mit postmessage irgendwelche tastenevents in das edit zu generieren?

Oder kennt sonst jemand einen weg ein Fremdes Edit mit Zahlen zu befüllen ohne über postmessage oder ähnliches benützen?

Oder kennt jemand eine Methode SendInput und Postmessage zu kombinieren? Sozusagen mehrere zeichen gleichzeitig an einen bestimmten handle zu senden? Etwas an einen Handle zu senden kann ja Postmessage, und eine zeichen kette versenden kann sendinput. Genaueres findet ihr im thema explizites tasten event auslösen. Wo es darum ging das es nicht möglich manuell gedrücktes ctrl/Shift per postmessage zu ignorieren.

mit der hoffnung auf eine gute lösung

gibb

Blup 26. Mai 2010 14:41

Re: Eine komponente einer anderen Applikation anektieren
 
Ohne "postmessage oder ähnliches benützen" wird es wohl nicht funktionieren.

Die der Nachricht WM_SETTEXT ändert den Text eines Controls bzw. Editfeldes.

rollstuhlfahrer 26. Mai 2010 16:10

Re: Eine komponente einer anderen Applikation anektieren
 
wenn du nonVCL ein Edit-Feld machst, kannst du das in deiner eigenen Anwendung auch nicht mit Text befüllen, ohne Fensternachrichten zu verschicken. Die VCL kapselt diesen Vorgang nur für dich. Du könntest jetzt im Speicher raten, wo sich der Text des Edit-Feldes gerade befindet und dementsprechend den Speicher manipulieren und dann per Fensternachricht dem Edit-Feld sagen, es solle sich neu zeichnen.

Du kommst also nicht um Send/PostMessage() herum.

Bernhard

ADD: manuell gedrücktes Strg/Alt/Shift kannst du umgehen, indem du die Tasten per API "anhebst" also das drücken aufhebst (Taste-hoch-Parameter). Dann meint Windows, die Taste wäre nicht gedrückt, obwohl du den Finger drauf hast.

mkinzler 26. Mai 2010 16:13

Re: Eine komponente einer anderen Applikation anektieren
 
Zudem könnten neuere Windowsversionen diesen weg verbauen

rollstuhlfahrer 26. Mai 2010 16:18

Re: Eine komponente einer anderen Applikation anektieren
 
Zitat:

Zitat von mkinzler
Zudem könnten neuere Windowsversionen diesen weg verbauen

In wie fern? - Nachrichten kommen nur dann nicht an, wenn 2 Prozesse mit unterschiedlich starken Rechten kommunizieren wollen.

mkinzler 26. Mai 2010 16:22

Re: Eine komponente einer anderen Applikation anektieren
 
Ich meinte beim direkten Zugriff, z.B. über den Speicher

Christian Seehase 26. Mai 2010 22:20

Re: Eine komponente einer anderen Applikation anektieren
 
Moin gibb,

für den Zweck schlage ich die Messages Hier im Forum suchenWM_GETTEXT/MSDN-Library durchsuchenWM_GETTEXT und Hier im Forum suchenWM_SETTEXT/MSDN-Library durchsuchenWM_SETTEXT vor.

gibb 27. Mai 2010 09:04

Re: Eine komponente einer anderen Applikation anektieren
 
Und bei sendMessage in kombination mit wm_SETTEXT werden vom benutzer gedrückte tasten ignoriert?

Sonst seh ich den sinn nicht das zu benutzen ;) Werds aber auf jeden fall testen.

Gruss Sev
Edit:@rollstuhlfahrer: Das mit dem anheben hat bei postmessage nicht funktioniert. genaueres findest du im anderen Thread.

gibb 28. Mai 2010 15:15

Re: Eine komponente einer anderen Applikation anektieren
 
Hi,

Also, ich habe das mal versucht, und es scheint auch ziemlich gut zu funktionieren. zumindest in meinem "Testfall"

Delphi-Quellcode:
SendMessage(hwndControl,WM_SETTEXT,0,(Integer(PChar(strNewSpeed))));
Das einzige was mich stutzig macht ist das es kein repaint auslöst der komponente resp. das edit aussieht als sei es leer bis ich mit der maus den text markiere. oder so tue als ob ich was markieren möchte.

ctrl, shift scheint er so sowieso schon zu ignorieren.

Gruss Sev

Blup 28. Mai 2010 16:50

Re: Eine komponente einer anderen Applikation anektieren
 
Wenn das Steuerelement nicht selbst mitbekommt das es sich neu zeichnen muss, geht immer noch InvalidateRect.

rollstuhlfahrer 28. Mai 2010 16:57

Re: Eine komponente einer anderen Applikation anektieren
 
du kannst dem Steuerelement auch per RedrawWindow sagen, dass es sich neu zu zeichnen hat.

Bernhard

gibb 1. Jun 2010 16:09

Re: Eine komponente einer anderen Applikation anektieren
 
Kann ich ihm auch mitteilen das sich der inhalt geändert hat?

Also sozusagen ein change event ausläsen ? die andere applikation erkennt nämlich nicht das der text sich geändert hat.

ein change event würde sicherlich auch ein repaint auslösen.

gruss gibb

gibb 8. Jun 2010 11:41

AW: Eine komponente einer anderen Applikation anektieren
 
Delphi-Quellcode:
      SendMessage(hwndControl,WM_SETTEXT,0,(Integer(PChar(strNewSpeed))));
      SendMessage(hwndControl,WM_SETREDRAW,1,0);
      RedrawWindow(HWNDControl, nil, 0, 0);
      PostMessage(HWNDControl, WM_KEYDOWN, VK_BACK,0); // backspace taste runter
      PostMessage(HWNDControl, WM_KEYUP , VK_BACK, $C0000000); // backspace taste rauf  }
Hey, ich hab jetzt folgendes Implementiert, das ganze wird bei mir gut dargestellt und auch sonst sieht alles jut aus. ABER Speedfan erkennt nicht das sich der wert geändert hat im Textfeld. :( Was soviel bedeutet wie Speedfan steuert nicht anhand der Zahlen die ich übergebe.

Desshalb habe ich auch noch den Backspace gesendet, in der Hoffnung das dann das TSpinEdit Feld realisiert das es intern was abzuarbeiten hat. Leider hat der Backspace nicht funktioniert. Daher meine Frage, wie kann ich dem Edit mitteilen das es interne Prozeduren/Events auslösen muss genau gleich als hätte ich von hand etwas reingetippt?

Gruss gibb

freak4fun 8. Jun 2010 11:44

AW: Eine komponente einer anderen Applikation anektieren
 
Vielleicht mal mit Enter versuchen?

gibb 8. Jun 2010 13:04

AW: Eine komponente einer anderen Applikation anektieren
 
ja währ ne idee, aber ich denke nicht das das hilft. sonst ist ja auch kein enter notwendig. Die reine eingabe der zahlen bewürken wohl über die entpsrechenden events bereits das sich das Programm aktualisiert.

gibb 9. Jun 2010 09:34

AW: Eine komponente einer anderen Applikation anektieren
 
Also, das mit dem Enter funktioniert auch nicht. gibt es ne möglichkeit changeevent oder andere solche events anzustossen?

Gruss Sev

David Martens 10. Jun 2010 18:51

AW: Eine komponente einer anderen Applikation anektieren
 
versuch doch mal

Delphi-Quellcode:
SendMessage(hwndControl,EN_CHANGE,0,0);
Kommt von hier:
Delphi-Quellcode:
unit Messages;
...
{ Edit Control Notification Codes }

const
  {$EXTERNALSYM EN_SETFOCUS}
  EN_SETFOCUS = $0100;
  {$EXTERNALSYM EN_KILLFOCUS}
  EN_KILLFOCUS = $0200;
  {$EXTERNALSYM EN_CHANGE}
  EN_CHANGE   = $0300;
  {$EXTERNALSYM EN_UPDATE}
  EN_UPDATE   = $0400;
  {$EXTERNALSYM EN_ERRSPACE}
  EN_ERRSPACE = $0500;
  {$EXTERNALSYM EN_MAXTEXT}
  EN_MAXTEXT  = $0501;
  {$EXTERNALSYM EN_HSCROLL}
  EN_HSCROLL  = $0601;
  {$EXTERNALSYM EN_VSCROLL}
  EN_VSCROLL  = $0602;
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 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 by Thomas Breitkreuz