Entwickler-Ecke
Windows API - Strg+C aus GUI heraus an Konsole schicken
Postman - Di 23.02.10 13:01
Titel: Strg+C aus GUI heraus an Konsole schicken
Hallo,
ich habe eine Test GUI die eine Konsolenanwendung per ShellExecute aufruft. Der Aufruf funktioniert soweit wunderbar (Konsole poppt auf, Programm läuft sauber an), allerdings kann ich die Konsole nicht aus der GUI heraus per Strg+C beenden, wie es manuell möglich ist (der Sinn dahinter ist, dass die Konsolenanwendung mit Strg+C sauber herunterfährt, beim Abschießen entstehen diverse Probleme).
Der Ansatz ist, sich aus der GUI heraus mit AttachConsole() an die Konsole der Konsolenanwendung "dranzuhängen" und dann das GenerateConsoleCtrlEvent() abzuschicken. Der Errorcode beim Ausführen des AttachConsole() ist 5 (Access is denied.). Die Frage ist, warum ist es mir nicht möglich, mich an die Konsole dranzuhängen? Beide Anwendungen werden vom gleichen User aus aufgerufen.
Hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| Function AttachConsoleDummy(dwProcessId: LongWord): LongBool; Begin Result := False; End;
procedure TForm1.Button1Click(Sender: TObject); var PID: DWORD; AttachConsole: Function(dwProcessId: LongWord): LongBool; StdCall; errorcode: integer; begin GetProcessHandle(PID);
AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole'); If @AttachConsole = nil Then AttachConsole := @AttachConsoleDummy; AttachConsole(PID); errorcode := GetLastError;
GenerateConsoleCtrlEvent(CTRL_C_EVENT,0); errorcode := GetLastError; end;
procedure TForm1.FormCreate(Sender: TObject); var file: string; myHandle: THandle; PID: DWORD; return: integer; begin fServicePath := 'D:/'; file := fServicePath + 'meineexe.exe'; ZeroMemory(@ffileProcInfo, SizeOf(ffileProcInfo)); return := ShellExecute(Handle, nil, PChar(file), nil, nil, SW_SHOW); end;
function GetProcessHandle(var PID: DWORD): THandle; begin PID := GetPidFromProcessName('meineexe.exe'); Result := OpenProcess(PROCESS_ALL_ACCESS, False, PID); end; |
ALF - Di 23.02.10 13:35
Hi, ich hoffe nix falsch zu sagen, aber wer erhält das Handle nach diesem Aufruf?
Delphi-Quelltext
1:
| GetProcessHandle(PID); |
müsste es nicht so
ähnlich sein?
Delphi-Quelltext
1:
| hndl:= GetProcessHandle(PID); |
Irgendwie ist mir das nicht ganz logisch, hab aber nicht soviel Ahnung davon, aber
PID ist doch irgendwie nicht gesetzt oder?
Sollte man das return nicht auswerten?
Delphi-Quelltext
1:
| return := ShellExecute(Handle, nil, PChar(file), nil, nil, SW_SHOW); |
Gruss Alf
Jakob_Ullmann - Di 23.02.10 17:11
ALF, doch PID ist gesetzt, weil die function PID als Argument als Referenz entgegennimmt, das heißt sie setzt diese Variable (erkennbar am
var). -> Call by reference / call by value
@Postman: Naja, eigentlich reicht es ja, wenn du die Konsole fokusieren kannst, dann kannst du den Tastendruck simulieren. Zum Beispiel so:
Delphi-Quelltext
1: 2: 3: 4:
| keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(Ord('C'), 0, 0, 0); keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); |
Postman - Mi 24.02.10 13:57
Danke euch beiden, aber hat sich inzwischen erledigt.
Der obige Code funktioniert, es war nur ein Rechte Problem unter Windows 7, die UAC hat dazwischengefunkt und offenbar somit den Zugriff verweigert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!