Autor |
Beitrag |
swolfgarten
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 16.08.04 16:49
Hallo,
ich möchte gerne an fremde Prozesse Windows-Nachrichten mit dem internen Windows-Nachrichtendienst senden. In einer ListBox liste ich alle lokal laufenden Prozesse auf und wenn eines ausgewählt ist, wird folgender Code ausgeführt (Fenster soll geschlossen werden):
Delphi-Quelltext 1: 2: 3: 4: 5:
| hwndShoot := FindWindow('', PChar(ListBox1.Items[ListBox1.ItemIndex])); SendMessage(hwndShoot, WM_KEYDOWN, VK_MENU, 0); SendMessage(hwndShoot, WM_KEYDOWN, VK_F4, 0); SendMessage(hwndShoot, WM_KEYUP, VK_F4, 0); SendMessage(hwndShoot, WM_KEYUP, VK_MENU, 0); |
Irgendwie funzt das aber net. Kann mir jemand sagen, was an diesem Code falsch ist bzw. wie ich an fremde Prozesse Nachrichten (z. B. Alt+F4) schicken kann?
Danke und Gruß,
Seb
Moderiert von Motzi: Delphi-Tags hinzugefügt.
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Mo 16.08.04 17:09
Wenn Du das Prog beenden willst, dann nimm doch einfach die Message WM_QUIT
raziel
_________________ JSXGraph
|
|
swolfgarten 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 16.08.04 17:37
Titel: Andere Nachrichten als WM_QUIT senden
Hallo,
ein Nachtrag: Ich möchte auch noch andere Nachrichten als
Alt+F4 an fremde Prozesse schicken. Was ist also an dem Code falsch?
Ist es der FindWindow-Aufruf ohne bzw. mit leerem ersten Parameter?
Danke und Gruß,
Seb
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Mo 16.08.04 18:05
Jup, der erste Parameter sollte entweder die Klasse des Fensters beinhalten, oder nil sein. WM_QUIT klappt irgendwie nicht, nimm lieber WM_DESTROY oder WM_CLOSE. Außerdem sollte man erst überprüfen, ob das Handle <> 0 ist...
So siehts dann komplett aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var hwndShoot: THandle; begin hwndShoot := FindWindow(nil, 'Unbenannt - Editor'); if hwndShoot <> 0 then SendMessage(hwndShoot, WM_CLOSE, 0, 0) else showmessage('nix gfunde!'); |
Einfach ein Notepad Fenster öffnen, nicht speichern und aufs Knöpfle drücke...
Ach und: Was denn noch für Nachrichten?
raziel
_________________ JSXGraph
|
|
swolfgarten 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 16.08.04 18:57
Titel: Alt+F1 senden
Hallo,
erstmal vielen Dank für die Hilfe. Das Problem ist, wenn ich sowas wie Notepad.exe aus der Liste der laufenden Prozesse auswähle, weiß ich ja nicht, wie der Titel/Name des Fensters/Handle gerade lautet. Es ist einfach, sowas wie "Unbenannt - Editor" zu schließen, nur wie kriege ich das bei einem Programm raus, was ich mir aus meinem nachgebastelten Taskmanager ausgewählt habe?
Vielen Dank und schöne Grüße,
Sebastian
|
|
swolfgarten 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 16.08.04 18:59
Titel: Andere Nachrichten
Hi,
wie kann ich beispielsweise Alt+F1 (Hilfe) an ein beliebiges Fenster/Programm schicken? Muss ich von der .exe erst den Handler/Namen herausfinden und dann wie besprochen die Nachrichten senden?
Viele Grüße,
Seb
|
|
af70
      
Beiträge: 22
|
Verfasst: Mo 16.08.04 19:16
Ich hatte mal das Problem vor längerer Zeit. Eine Win 3.1 Anwendung musste auf Win32 umgestellt werden. Danach haben die Tastatur-Nachrichten nicht mehr funktioniert. Ich hatte den Eindruck, dass es ab Win 32 nicht mehr funktioniert, Tastatur-Nachrichten an andere Prozesse zu schicken.
Ich habe damals das Problem mit "keybd_event" gelöst. Das Fenster muss dabei jedoch im Vordergrund sein.
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Mo 16.08.04 19:58
Wie stellst Du denn Deine Liste zusammen? Mit EnumWindows? Dann hast Du die Handles und über GetWindowText/GetWindowTextLength erhältst Du dann den Fenstertitel. Aber wenn Du eh schon das Handle hast, brauchst ja kein FindWindow mehr
raziel
_________________ JSXGraph
|
|
swolfgarten 
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 17.08.04 15:45
Titel: Code zum Auslesen der aktuell laufenden Prozesse
Hallo,
also mit folgendem Code lese ich die aktuell laufenden Prozesse aus:
procedure TForm1.Button1Click(Sender: TObject);
var handler: THandle;
data: TProcessEntry32;
function GetName: string;
var i:byte;
begin
Result := '';
i := 0;
while data.szExeFile[i] <> '' do
begin
Result := Result + data.szExeFile[i];
Inc(i);
end;
end;
begin
ListBox1.Items.Clear;
handler := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if Process32First(handler, data) then
begin
ListBox1.Items.Add(GetName());
while Process32Next(handler, data) do
ListBox1.Items.Add(GetName());
end
else
ShowMessage('Error obtaining process list, sorry.');
end;
So jetzt habe ich das Problem, dass ich aus dieser Liste einzelne Prozesse auswählen und dann Alt+F1 oder Alt+F1 oder sowas an diese senden möchte. Hat jemand ne Idee, wie ich das auch unter Berücksichtigung der hier stattgefundenen Diskussion hinkriege?
Vielen Dank und Gruß,
Seb
|
|
|