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 Text zur anderer Anwendung senden (https://www.delphipraxis.net/177638-text-zur-anderer-anwendung-senden.html)

Sugar 18. Nov 2013 14:35

Text zur anderer Anwendung senden
 
Hallo,

ich kämpfe mich gerade mit der Fernsteuerung einer fremden Anwedung ab. Ich möchte aus unserem Controlling-System heraus einen Auftrag in unserem ERP System aufrufen.

Ich kann den Suchdialog des fremden Programms öffnen, dort ist als einzige Komponente ein Grid. Manuell würde man nun eine Auftragsnummer eingeben und mit einer Funktionstaste aufrufen. Ich möchte nun eine mehrstellige Zeichenfolge an dieses Grind senden, und weiss nicht wie ich dies übertragen kann. Ich finde das Handle des Grids, zerlege den String der die Auftragsnummer bedeutet in einzelne Zeichen und müsste diese nun irgendwie übertragen. Ich habe schon diverse Code-Schnipse ausprobiert, aber noch nicht zum Ziel gelangt. Kann mir da jemend helfen?

Gruß
Sugar

Lemmy 18. Nov 2013 14:41

AW: Text zur anderer Anwendung senden
 
Hi,

wenn Du an die Sourcen beider Programme ran kommst, dann bieten sich für Kleinigkeiten die Windows Messages an, für größere "Kleinigkeiten" die Windows MMF.

Hast Du mit einem dieser Teile schon mal was gemacht? Wenn ja: Was waren da genau die Probleme, wenn nein, dann schau es dir mal an...

GRüße

Sugar 18. Nov 2013 14:58

AW: Text zur anderer Anwendung senden
 
Zitat:

Zitat von Lemmy (Beitrag 1236418)
Hi,

wenn Du an die Sourcen beider Programme ran kommst, dann bieten sich für Kleinigkeiten die Windows Messages an, für größere "Kleinigkeiten" die Windows MMF.

Hast Du mit einem dieser Teile schon mal was gemacht? Wenn ja: Was waren da genau die Probleme, wenn nein, dann schau es dir mal an...

GRüße

Ja, ich habe mit Windows Messages schon gearbeitet, in einem anderen Projekt bediene ich ebenfalls ein anderes Programm dass die so übertragenen Eingaben überprüft. Das war dahingehend einfach, weil die Eingabekomponenten klar erkennbar waren und mit Handle und SendMessage zurecht kamen.

Die Anwendung die ich jetzt bedienen muss setzt mit jedem Tatsendruck einen SELECT ab (warum auch immer so kompliziert weiß ich nicht) - ich muss also die Auftragsnummer in einzelne Zeichen zerlegen und nach unc nach absenden. Größer wird die Sache nicht, wenn ich diese Eingabe umgesetzt bekomme fehlt nur noch ein klick zum Aufru. Und der steht schon ;)

musicman56 18. Nov 2013 16:07

AW: Text zur anderer Anwendung senden
 
Hallo,

einzelne Zeichen sende ich so:

Delphi-Quellcode:
  SendMessage(FDBGridHandle,WM_CHAR,30,0);

lbccaleb 18. Nov 2013 17:14

AW: Text zur anderer Anwendung senden
 
MSDN-Library durchsuchenWM_COPYDATA

sollte dir weiterhelfen.

Sugar 18. Nov 2013 17:20

AW: Text zur anderer Anwendung senden
 
Danke für die Hinweise! Mein Kernproblem aber bleibt, wie ich einen Text ind die entsprechenden Integerparamter umwandle die WM_COPYDATA und WM_CHAR erwarten?

Zudem denke ich, dass das Grid, das ja die Tastatureingabe des externen Programms verarbietet explizit auf Key UP/Down reagiert....

Medium 18. Nov 2013 23:20

AW: Text zur anderer Anwendung senden
 
Dann schicke ihm doch noch eines, dafür gibt es ja auch Messages. Vom "Klang" her würde ich schätzen, dass es Sinn machen könnte das letzte Zeichen des Textes aus dem WM_COPYDATA raus zu lassen, und per WM_KEYDOWN/UP nachzuliefern. Wenn die Routine des Zielprogramms wirklich pro Char ausgeführt werden soll, kann man damit ja auch im Zweifel den gesamten Text kleckerweise rüber schubsen. Oder ich habe das Problem missverstanden; auch immer eine Option :)

Sugar 19. Nov 2013 07:07

AW: Text zur anderer Anwendung senden
 
Nein, das Problem ist schon korrekt verstanden. Ob ich den String am Ende wirklich auch "zerlegen" muss oder nicht ist mir eiegtnlich egal, zum testen müsste ich nur wissen, wie man einen String mit WM_CHAR "versendet"

Beispiel: Mein Suchbegriff ist "123/01"

Den Ausdruck zerlege ich in 1-2-3-/-0-1 und würde ihn dann folgendermaßen senden wollen:

sendmessage(handle,wm_char,ord('1'),0);
sendmessage(handle,wm_char,ord('1'),0);
...
Zum testen in Ordnung.

Nur, wie wanlde ich die einzelnen Zeichen so um, dass ich in den Ausdruck buchstabenweise übergeben kann also eine Schleife durchlaufe und jedes einzelne Zeichen von 1 bis Ende übergebe?

In Etwa so:

sendmessage(handle,wm_char,ord(Copy(MeinSTtring,1,1)),0);

baumina 19. Nov 2013 07:29

AW: Text zur anderer Anwendung senden
 
Meinst Du so?

Delphi-Quellcode:
for i := 1 to length(MeinString) do
begin
  sendmessage(handle,wm_char,ord(MeinString[i]),0);
end;

himitsu 19. Nov 2013 08:14

AW: Text zur anderer Anwendung senden
 
Ausprobieren?

Aber was die Parameter betrifft: MSDN-Library durchsuchenWM_CHAR
Also falls der lParam doch nötig ist. (kommt ja auch etwas darauf an, welche Messages und wie das Programm diese auswertet)

baumina 19. Nov 2013 08:31

AW: Text zur anderer Anwendung senden
 
Zitat:

Zitat von himitsu (Beitrag 1236508)
Ausprobieren?

:-D Meine Antwort war deswegen als Frage formuliert, weil sie mir zu einfach schien und ich mir nicht sicher war, ob diese Lösung überhaupt in die Richtung der Frage zielte. :-D

stoxx 19. Nov 2013 09:07

AW: Text zur anderer Anwendung senden
 
Zitat:

Zitat von baumina (Beitrag 1236504)
Meinst Du so?

Delphi-Quellcode:
for i := 1 to length(MeinString) do
begin
  sendmessage(handle,wm_char,ord(MeinString[i]),0);
end;


Autsch ....
hier mal meine SendDebug function ...

Delphi-Quellcode:

function SendDebug(Value : string):Integer;
var
  RcvHandle: THandle;
  cd: TCopyDataStruct;
begin
  RcvHandle:=GetRcvHandle;
  result := 0;
  if RcvHandle<>0 then begin
    cd.dwData:=0;
    cd.cbData:=Length(Value)+1;
    cd.lpData:=PChar(Value);
    result := SendMessage(RcvHandle, WM_COPYDATA, Application.Handle, Integer(@cd));
  end;
  LastDebugString := Value;
end;

Medium 19. Nov 2013 09:40

AW: Text zur anderer Anwendung senden
 
Ich weiss nicht, ob WM_CHAR ein KeyDown/Pressed auslöst. Ich dachte eher an WM_KEYDOWN und WM_KEYUP.

musicman56 19. Nov 2013 09:44

AW: Text zur anderer Anwendung senden
 
Hallo,

meine Vermutung ist, das das DBGrid einfach die Tastatur (OnKeyDown, OnKeyPress...) abfragt, und dabei jedesmal einen select oder Ähnliches abschickt....

Zitat:

Zitat von Sugar
Die Anwendung die ich jetzt bedienen muss setzt mit jedem Tatsendruck einen SELECT ab (warum auch immer so kompliziert weiß ich nicht

...und aus diesem Grund habe ich WM_CHAR vorgeschlagen, weil man dadurch die "eventuell erforderliche" Möglichkeit hat, eine kleine Verzögerung einzubauen. Das geht mit WM_COPYDATA nicht.

Zum Beispiel:
Delphi-Quellcode:
for i := 1 to length(MeinString) do
begin
  SendMessage(handle,wm_char,ord(MeinString[i]),0);
  Sleep(100);
end;
@Medium Stimmt, WM_KEYDOWN oder WM_KEYUP könnte natürlich auch die Lösung sein. Das muss man einfach mal ausprobieren. Wichtig erscheint mir die Verzögerung, damit dem Zielprogramm etwas Zeit bleibt, den Tastendruck zu verarbeiten.

himitsu 19. Nov 2013 09:49

AW: Text zur anderer Anwendung senden
 
WM_COPYDATA und Co. funktiuoniert aber auch nur, wenn man auf beide Programme Zugriff hat, oder der Empfänger sowas schon implementiert hat,
was hier aber wohl nicht der Fall ist.

baumina 19. Nov 2013 09:56

AW: Text zur anderer Anwendung senden
 
Zitat:

Zitat von stoxx (Beitrag 1236516)
Zitat:

Zitat von baumina (Beitrag 1236504)
Meinst Du so?

Delphi-Quellcode:
for i := 1 to length(MeinString) do
begin
  sendmessage(handle,wm_char,ord(MeinString[i]),0);
end;


Autsch ....

:oops: So schlimm mein Code?

hathor 19. Nov 2013 18:05

AW: Text zur anderer Anwendung senden
 
Communicate between processes using windows messaging

http://www.delphidabbler.com/tips/51

Delphi-Quellcode:
SENDER:

// wmCopyData
// Allows inter-process communications via Windows WM_COPYDATA messaging.
procedure wmCopyData(WndClass:PChar;WndTitle:PChar;Msg:String);
var
  hWnd : THandle        // Handle to target window to receive message
  cds  : CopyDataStruct; // Structure to package the outbound message
begin
  // Find target window
  hWnd := FindWindow(PChar(WndClass), PChar(WndTitle));
  try
    cds.dwData := 0
    cds.cbData := Length(Msg);  // Length of message
    cds.lpData := PChar(Msg);   // Actual message
    // The following function is not necessary for this to work
    SetForegroundWindow(hWnd);  // Pulls target window up top
    SendMessage(hWnd, wm_CopyData, 0, Integer(@cds));
send the message
  finally
    CloseHandle(hWnd)           // Close handle to target
  end;
end;
// A typical call to this procedure would be:

wmCopyData('NOTEPAD','Untitled - Notepad','Test Message');

//----------------------------------------------------------------
RECEIVER:

// Add a custom message handler so our app gets notified upon receipt
private
  procedure WMGetData(var Msg: TWMCopyData); message WM_COPYDATA;

// wmGetData
// Receives inbound messages - Callback function
// Called from message handler
procedure TForm1.wmGetData(var Msg: TWMCopyData);
var
  sText: array[0..255] of Char; // Create an array to store message in
begin
  // Cast inbound data structure into a character array
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  Edit1.Text := sText;
end;

EWeiss 20. Nov 2013 05:56

AW: Text zur anderer Anwendung senden
 
JO ist der Normalfall.
Bringt aber nichts, wie himitsu schon sagt.
Wird WM_COPYDATA in der angesprochenen Anwendung nicht Unterstützt kann man da senden was man will.

gruss

Sugar 20. Nov 2013 18:11

AW: Text zur anderer Anwendung senden
 
Also, ich habe nun alle meine Probleme - bis auf eines - lösen können. Vielen Dank für die Hilfe.

Mein einzig verbliebenes Problem ist, das Fenster der anderen Anwendung - im Falle es ist minimiert - so in den Vordergergrund zu holen, dass es später auch wieder minimiert werden kann.

Ich benutze folgenden Code um die Fremdanwendung nac "vorne" zu holen.

ShowWindow(wndMain, SW_SHOW);
BringWindowToTop(wndMain);

Nur kann man danach die Fremdanwendung nicht mehr minimieren...

Vergesse ich da was?


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