Autor Beitrag
swolfgarten
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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):

ausblenden 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 user profile iconMotzi: Delphi-Tags hinzugefügt.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 16.08.04 17:09 
:welcome:

Wenn Du das Prog beenden willst, dann nimm doch einfach die Message WM_QUIT ;)

raziel

_________________
JSXGraph
swolfgarten Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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:
ausblenden 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, 00)
  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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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