Tastendruck in einem laufenden Prozess
-
Hi Leute
Folgendes ich möchte einen Tastendruck in einem laufendem Programm simulieren.
Kann mir da einer nen Tipp geben wie ich da am besten dran gehe?
-
-
Das ist ja schonmal ganz gut aber wie verbinde ich mich auf den Prozess oder muss ich den irgendwie nur aktiv setzen?
-
Erläutere mal was Du genau vorhast. Im Moment ist die Informaiton nur, dass Du einen Tastendruck simulieren willst. Dieser wäre dann (IMHO) so, als hättest Du ihn wirklich auf der Tastatur gedrückt. Er geht also an das aktuelle Eingebeelement und alles, was sich in der Queue einklinkt. (Hooks etc.)
Es gibt noch dinge wie FindWindow um vorher ein bestimmtes Fenster zu finden und die Nachricht dort hin zu senden. Je nach dem was Du vorhast, gibt es auch verschiedene Wege.
[Edit]
Falsch interpretiert. Ich nahm an, das Du Deinen eigenen Prozess meinst. Ich lass es aber mal dennoch so stehen.
[/Edit]
-
So folgendes ich habe ein Windows Form erstellt mit einem Button.In dem Button event steht folgendes:
IntPtr calculatorHandle = FindWindow("notepad", "Unbenannt - Editor"); // Verify that Calculator is a running process. if (calculatorHandle == IntPtr::Zero) { MessageBox::Show("Calculator is not running."); return; } // Make Calculator the foreground application and send it // a set of calculations. SetForegroundWindow(calculatorHandle); SendKeys::SendWait("111"); SendKeys::SendWait("*"); SendKeys::SendWait("11"); SendKeys::SendWait("=");
Nebenbei hab ich auch das Notepad gestartet.Dieser Code klappt auch bloss er schaltet die Notepad anwendung nicht aktiv trotz SetForegroundWindow.
-
Wollte das gerne mal nachvollziehen, nur bei mir findet er FindWindows nicht.
Unbekannter Bezeichner.
Könntest Du bitte den ganzen Code posten!?
Muss ich da noch eine Header includen?Gruß
-
@J.Tester
windows.h (F1 auf FindWindow, da findest Du die Info)
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { HWND hnd = FindWindow(NULL,L"Unbenannt - Editor"); if(hnd == NULL) return; SetForegroundWindow(hnd); // Zeit lassen um das Fenster nach vorne zu schaufeln System::Threading::Thread::Sleep(250); SendKeys::SendWait("Test\r\n"); SendKeys::SendWait("H"); SendKeys::SendWait("a"); SendKeys::SendWait("llo Welt"); }
-
Fehler 1 error C2065: 'HWND': nichtdeklarierter Bezeichner
Fehler 4 error C2065: 'NULL': nichtdeklarierter Bezeichner
Fehler 5 error C3861: "FindWindow": Bezeichner wurde nicht gefunden.Muss ich noch was includen?
Haut so nicht hin.
NULL ist doch auch kein C++/CLI.
Bin ich im flaschen Forum?Gruß
Jens
-
Lies was man Dir schreibt. Du musst die windows.h includen.
-
Hast Du den Code getestet? Oder nur so hingeklatscht?
Das ist jetzt mit "Windows.h"Fehler 1 error LNK2028: Nicht aufgelöstes Token (0A000010) ""extern "C" int __stdcall SetForegroundWindow(struct HWND__ *)" (?SetForegroundWindow@@$$J14YGHPAUHWND__@@@Z)", auf das in Funktion ""private: void __clrcall Kaese::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@Kaese@@$$FAAAVObject@System@@P$AAVEventArgs@4@@Z)" verwiesen wird. Kaese.obj
Fehler 2 error LNK2028: Nicht aufgelöstes Token (0A000011) ""extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z)", auf das in Funktion ""private: void __clrcall Kaese::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@Kaese@@$$FAAAVObject@System@@P$AAVEventArgs@4@@Z)" verwiesen wird. Kaese.obj
Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall SetForegroundWindow(struct HWND__ *)" (?SetForegroundWindow@@$$J14YGHPAUHWND__@@@Z)" in Funktion ""private: void __clrcall Kaese::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@Kaese@@$$FAAAVObject@System@@P$AAVEventArgs@4@@Z)". Kaese.obj
Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z)" in Funktion ""private: void __clrcall Kaese::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@Kaese@@$$FAAAVObject@System@@P$AAVEventArgs@4@@Z)". Kaese.obj
Fehler 5 fatal error LNK1120: 4 nicht aufgelöste externe Verweise.
Komm lass, mach ich selber.
So weit war ich auch schon mal.Gruß, der Fischer von Sandro Guan
-
Ja du brauchst noch nen dll import von der user32.dll und musst Findwindow und Setforegroundwindow noch bestimmen.Ich poste gleich mal den gesamten Code.
Aber zurück zu meiner Frage: Warum setzt er das nicht in den Vordergrund?
EDIT: Hier der Code:
public: [DllImport("USER32.DLL")] static IntPtr FindWindow(String^ lpClassName, String^ lpWindowName); public: [DllImport("USER32.DLL")] static bool SetForegroundWindow(IntPtr ^hWnd); private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { IntPtr ^calculatorHandle = FindWindow("notepad", "Unbenannt - Editor"); if (calculatorHandle == IntPtr::Zero) { MessageBox::Show("Calculator is not running."); return; } SetForegroundWindow(calculatorHandle); SetForegroundWindowEx(calculatorHandle); SendKeys::SendWait("111"); SendKeys::SendWait("*"); SendKeys::SendWait("11"); SendKeys::SendWait("="); }
-
Hat sich erledigt Fehler gefunden.
-
Dann teile allen anderen doch bitte mit, wo der Fehler lag.
-
Einfach die Handles von IntPtr wegnehmen
IntPtr calculatorHandle = FindWindow("notepad", "Unbenannt - Editor");
-
Hallo,
Ich arbeite mit Win32Konsole und möchte einen Tastendruck an einen bestimmten Prozess (hl.exe, Counter-Strike) senden. Allgemein funktionierte keybd_event bei verschiedensten Anwendungen wie Notepad oder Firefox recht gut, aber CS scheint sehr immun dagegen zu sein (warum, kann sich wohl jeder denken.)
Bis jetzt habe ich folgenden Code:#include "stdafx.h" #include <windows.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HWND hwnd = FindWindow(0,L"Counter-Strike"); DWORD dwProcessId = NULL; GetWindowThreadProcessId(hwnd,&dwProcessId); HANDLE hFin = OpenProcess(PROCESS_VM_READ,false,dwProcessId); if(!hwnd || !hFin) { cout << "Error " << hwnd << "," << hFin; getchar(); } else { SetForegroundWindow(hwnd); } while(1) { while(GetAsyncKeyState(VK_F3)) { SendMessage(hwnd,WM_KEYDOWN,VK_SPACE,0); Sleep(100); SendMessage(hwnd,WM_KEYUP,VK_SPACE,0); Sleep(300); } Sleep(100); } return 0; }
Leider habe ich keine Ahnung von WinAPI was wohl für das Scheitern meines Projektes verantwortlich ist.
Nun bin ich mir sicher dass ich den hFin Handle für den Simulierten Tastendruck einbinden muss, nur womit??
PS: Ich habe wirklich nicht vor den Spielspaß zu stören, danke.
-
Versuch mal SendInput oder Hook entsprechende API Funktionen.
-
SendInput
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
btw. die Funktion kann man schnell "falsch" verwenden so das es scheint als würde es funktionieren aber in wirklichkeit funktioniert es nicht zuverlässig.
Such halt hier im Forum falls deine SendInput Funktion mal funktioniert und mal nicht ... Da kann man seltsame Sachen mit erleben.
-
besten Dank,
hatte es aber noch mit keybd_event hinbekommen.while(1) { while(GetAsyncKeyState(VK_SPACE)) { keybd_event(VK_MBUTTON,0,KEYEVENTF_EXTENDEDKEY,dwProcessId); Sleep(18); keybd_event(VK_MBUTTON,0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,dwProcessId); Sleep(18); } Sleep(100); }
Da man ja auch von offizieller Seite zu SendInput wechseln soll, teste ich das Programm mal eine Weile sehr genau, ob auch wirklich jeder Befehl reinkommt.