In Fremdes memo etc.
-
ne das kann auch nicht klappen mit WM_SETTEXT da sich der string in deinem prozess befindet und nicht im anderen. du könntest die tastatureingabe simulieren oder dich irgendwie in den anderen prozess injezieren is aber ne komplizierte sache *g*
-
Verschoben nach "WinAPI".
-
Original erstellt von <handle>:
**klappt nichtvoid __fastcall TForm1::Button1Click(TObject *Sender) { HWND Window; String text = "test"; Window = FindWindow("Unbenannt - Editor", NULL); FindWindowEx(Window,0,"Memo",NULL); SendMessage(Window,WM_SETTEXT,0,(LPARAM)(LPCTSTR)text.c_str()); }
**
Lies mal in der MSDN nach, was FindWindow() an Parametern erwartet!
FindWindow(ClassName, WindowTitle);
Also solltest Du lieber mit
Window = FindWindow(NULL, "Unbenannt - Editor");
arbeiten!
Außerdem würde ich persönlich eher mit EnumWindows() und EnumChildWindows() arbeiten!
-
Original erstellt von <lb>:
ne das kann auch nicht klappen mit WM_SETTEXT da sich der string in deinem prozess befindet und nicht im anderen.Das geht auch mit WM_SETTEXT.
-
für die Simulation eines Buttonklicks gibts
BM_CLICK
An application sends a BM_CLICK message to simulate the user clicking a button. This message causes the button to receive a WM_LBUTTONDOWN and a WM_LBUTTONUP message, and the button?s parent window to receive a BN_CLICKED notification message.
-
...and the button's parent window to receive a BN_CLICKED notification message.
...und deshalb kannst Du auch gleich BN_CLICKED an das Parent/die Anwendung schicken!
Und selbstverständlich klappt das mit WM_SETTEXT!
Ich ändere Dir jeden beliebigen Fenstertitel/Inhalt anhand des betreffenden Handles, sogar mit Strings, die nur in meinem Prozeß existieren... LOL!
-
Und jetzt kommt die große Preisfrage? Warum geht das, obwohl jeder Prozess in einem eigenen Adressbereich läuft? :p
Antwort steht im Richter.
-
Kannst du die Antwort verraten? Ich würde es gerne wissen, hab das Buch aber leider nicht. Bitte.
-
hallo,
die folgende lösung habe ich bei mir mit borland c++builder 5.1 enterprise getestet:
void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hwnd = FindWindow("notepad", NULL); if (hwnd != 0) { hwnd = FindWindowEx(hwnd, 0, "Edit", NULL); String Str = "Kukuk"; for (int i = 1; i <= Str.Length(); i++) SendMessage(hwnd, WM_CHAR, (int)Str[i], 0); } }
mfg
murph
-
Original erstellt von <Jens>:
Kannst du die Antwort verraten? Ich würde es gerne wissen, hab das Buch aber leider nicht. Bitte.Puh jetzt wird es kompliziert. Mal sehen, ob ich es noch zusammenbekomme.
Also unter 16-Bit Windows waren die Adressräume noch nicht so abgeschottet, man konnte also auf den Adressraum eines anderen Prozess ohne weiteres zugreifen. Davon haben viele Programme gebrauch gemacht. Und im die Kompatibilität zu gewährleisten werden Nachrichten wie WM_SETTEXT und WM_GETTEXT in einen Adressraum gemappt, auf den alle zugreifen können. Das geht aber nur bei Steuerelementen, die schon unter 16-Bit verfügbar waren. Bei den neuen Steuerelementen, die ab Windows95 dazugekommen sind (Listview, Treeview etc.), hat Microsoft dazu keine Veranlassung gesehen. So dass du, wenn du auf diese Steuerelemente in fremden Anwendungen zugreifen willst entweder eine DLL in den Prozess injezieren mußt oder dir Speicher in dem Adressraum reservieren mußt.