![]() |
FindWindow
Hallo Leute,
Ich habe mir 2 Delphi Programme gemacht und möchte nun vom Prog1 das Prog2 steuern. im Prog1 steht unter anderem dieser Buttonclick:
Code:
im Prog2 habe ich aus Testzwecken nur einen Button. Name UND caption des Buttons(eig ja Panel aber egal) ist 'Button' und der Formname von Prog2 UND caption ist "Gesteuert".
procedure TForm1.Button1Click(Sender: TObject);
var hWnd: THandle; hBtn: THandle; begin hWnd := FindWindow(nil, 'Gesteuert'); if hWnd <> 0 then begin hBtn := FindWindowEx(hWnd, 0, nil, 'Button'); if hBtn <> 0 then begin SendMessage(hBtn, BM_CLICK, 0, 0); end else ShowMessage(SysErrorMessage(GetLastError)); end else ShowMessage(SysErrorMessage(GetLastError)); end; Ich bekomme KEINE showmessage, was mich sehr verwirrt.. wenn ich andere Sachen eingeben bekomme ich die showmessage. Das, was passieren soll, wenn ich auf den "Button" klicke, passiert nicht.. Wo liegt denn mein Fehler? :shock: P.s. Code ist von "Luckie" hier aus der Delphi-Praxis :)) |
AW: FindWindow
Der
![]() Nur so als Idee... |
AW: FindWindow
Hört sich nach einem guten Grund an.. habe mal einen Timer vorgeschaltet, dann die andere Form angeklickt und gewartet.. passiert allerdings auch nichts :( .
Dann muss ich das wohl mit tasten simulationen machen? nicht sehr elegant :| Also wie es scheint hat es schon jemand hinbekommen mit dem oben genannten befehl sendmessage(....) ![]() |
AW: FindWindow
Das sind deine Programme, also können/sollen sie sich "intern" unterhalten und garnicht erst versuchen ihre GUI zu misshandeln.
Stichwort: Inter-Process Communication (IPC) -> Pipes/NamedPips, MailSlots, MemoryMappedFiles (MMF), TCP/IP, richtige Messages ( ![]() |
AW: FindWindow
Hallo derseitzer,
ersetze einfach mal
Delphi-Quellcode:
durch
SendMessage(hBtn, BM_CLICK, 0, 0);
Delphi-Quellcode:
ZYL
SendMessage(hBtn, WM_LBUTTONDOWN, 0, 0);
SendMessage(hBtn, WM_LBUTTONUP, 0, 0); |
AW: FindWindow
Ach ja, Delphi-Fenster sind "Windows" (CreateWindow) und keine "Dialoge" (CreateDialog/CreateDialogIndirect).
BM_CLICK ist aber eine DialogMessage. Und selbst wenn es ein Dialog wäre, sagt die Hilfe auch noch Zitat:
|
AW: FindWindow
Liste der Anhänge anzeigen (Anzahl: 1)
Statt jedes einzelne Objekt zu suchen, ist es ausreichend, nur das Empfänger-Window zu suchen und dem die Messages zu senden.
Delphi-Quellcode:
SENDER:
var Form1: TForm1; aWnd : HWND; const WM_MY_MESSAGE = WM_USER + 10; //1034 implementation {$R *.dfm} procedure TForm1.bnMINIMIZEClick(Sender: TObject); begin if aWnd<>0 then Postmessage(aWnd,WM_SYSCOMMAND, SC_MINIMIZE,0); end; procedure TForm1.bnRESTOREClick(Sender: TObject); // SC_RESTORE begin aWnd := FindWindow(NIL, 'WindowProc'); if aWnd<>0 then BEGIN Postmessage(aWnd,WM_SYSCOMMAND, SC_RESTORE,0); SetForegroundwindow(aWnd); SendMessage(aWnd, WM_SYSCOMMAND, SC_RESTORE, aWnd); END; end; procedure TForm1.Button9Click(Sender: TObject); begin SendMessage(aWnd, WM_MY_MESSAGE, 123, 1); SendMessage(aWnd, WM_MY_MESSAGE, 123, 2); SendMessage(aWnd, WM_MY_MESSAGE, 123, 3); SendMessage(aWnd, WM_MY_MESSAGE, 123, 4); SendMessage(aWnd, WM_MY_MESSAGE, 123, 5); end; procedure TForm1.FormCreate(Sender: TObject); begin aWnd := FindWindow(NIL, 'WindowProc'); end; //sucht Empfänger procedure TForm1.bnCLOSEClick(Sender: TObject); begin if aWnd<>0 then Postmessage(aWnd,WM_SYSCOMMAND,SC_CLOSE,0); //Close Empfänger Application.Terminate; //Close Sender end; end. //--------------------------------------------------------- EMPFÄNGER: protected procedure WndProc(var Message: TMessage); override; end; var Form1: TForm1; const WM_MY_MESSAGE = WM_USER + 10; //1034 implementation {$R *.dfm} procedure TForm1.WndProc(var Message: TMessage); begin inherited; case Message.Msg of WM_MY_MESSAGE: BEGIN case Message.LParam of 1: PostMessage(Button1.Handle, BM_CLICK, 0, 0); 2: PostMessage(Button2.Handle, BM_CLICK, 0, 0); 3: PostMessage(Button3.Handle, BM_CLICK, 0, 0); 4: PostMessage(Button4.Handle, BM_CLICK, 0, 0); 5: PostMessage(Button5.Handle, BM_CLICK, 0, 0); end; END; end; end; procedure TForm1.bnCLEARClick(Sender: TObject); begin Memo1.clear; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add('B1'); end; procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Lines.Add('B2'); end; procedure TForm1.Button3Click(Sender: TObject); begin Memo1.Lines.Add('B3'); end; procedure TForm1.Button4Click(Sender: TObject); begin Memo1.Lines.Add('B4'); end; procedure TForm1.Button5Click(Sender: TObject); begin Memo1.Lines.Add('B5'); end; |
AW: FindWindow
Zu dem Beispiel:
|
AW: FindWindow
Zitat:
|
AW: FindWindow
Zitat:
Das kann noch Jahre dauern... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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