Zwei Programme gleichzeitig steuern



  • Gibt es in Windows eine Möglichkeit, gleichzeitig zwei Programme mit demselben Input zu steuern?

    Hintergrund: Ich habe Videos gesehen, wo jemand in vier Emulatorinstanzen vier Videosspiele gleichzeitig mit demselben Input steuert. Und ich frage mich, wie das geht.

    Der Emulator selbst scheint sowas nicht zu unterstützen. Deshalb müsste es ja eigentlich etwas sein, was generell in Windows verfügbar ist und das dann den Tastaturinput nicht nur an das aktive Fenster, sondern auch an andere ausgewählte Fenster weiterleitet.

    Kennt Ihr eine Möglichkeit, wie man sowas bewerkstelligt?


  • Mod

    Ja, das geht durchaus. Sogar im Prinzip recht einfach programmierbar, daher gibt es zahlreiche kleine und große Tools, die das machen. Zum Beispiel Autohotkey in Verbindung mit diesem Script. Aber noch viele andere mehr. GIDF.



  • SeppJ schrieb:

    Ja, das geht durchaus. Sogar im Prinzip recht einfach programmierbar, daher gibt es zahlreiche kleine und große Tools, die das machen. Zum Beispiel Autohotkey in Verbindung mit diesem Script. Aber noch viele andere mehr. GIDF.

    Eigentlich ganz einfach.



  • Was mich nun interessiert: Was ist das denn für ein Spiel? Ist das so ein MMORPG wo man Ressourcen einsammeln kann und später wird alles auf einen Hauptaccount übertragen? Oder willst d dich per Motorsäge durch 4 Zombies auf 4 Bildschirmen zugleich sägen?



  • Das ist bestenfalls zum Goldfarming zu gebrauchen.



  • Danke erstmal für die Antworten.

    abcd schrieb:

    Was mich nun interessiert: Was ist das denn für ein Spiel? Ist das so ein MMORPG wo man Ressourcen einsammeln kann und später wird alles auf einen Hauptaccount übertragen? Oder willst d dich per Motorsäge durch 4 Zombies auf 4 Bildschirmen zugleich sägen?

    Nein. Ich wollte einfach mal gucken, in wie weit man Street Fighter 2 auf MAME und auf SNES synchron spielen kann, bevor es auseinander läuft. (Also, jetzt im 2-Spieler-Modus.) Die Grafiken auf SNES sind ja kleiner. Und mich würde interessieren, ob sie die Bewegungen exakt angepasst haben (da die SNES-Version ja eigentlich recht authentisches Gameplay hat).



  • Ach so 😞
    Könnten wir dich nicht doch noch zu einer Zombie-Zersäg-Session überreden*g*



  • SeppJ schrieb:

    Ja, das geht durchaus. Sogar im Prinzip recht einfach programmierbar, daher gibt es zahlreiche kleine und große Tools, die das machen. Zum Beispiel Autohotkey in Verbindung mit diesem Script.

    Ich hab's mir mal angesehen. Das ist doch total scheiße. Du gibst nen Text ein und den sendet er dann hintereinander an alle gewählten Fenster. Na super! Wie soll ich denn damit ein Spiel steuern? Logischerweise muss die Eingabe gleichzeitig (oder zumindest mit minimaler Verzögerung) und "live" bei Knopfdruck erfolgen.

    SeppJ schrieb:

    Aber noch viele andere mehr. GIDF.

    Und welche Suchbegriffe soll ich benutzen? "send input to multiple windows" hat jedenfalls nichts Sinnvolles gebracht. Irgendwas über Putty, dann was zu Linux, dann dein Ergebnis, dann irgendwas mit Serversn, dann OSX etc.



  • Emu Lator schrieb:

    Ich hab's mir mal angesehen. Das ist doch total scheiße. Du gibst nen Text ein und den sendet er dann hintereinander an alle gewählten Fenster. Na super! Wie soll ich denn damit ein Spiel steuern? Logischerweise muss die Eingabe gleichzeitig (oder zumindest mit minimaler Verzögerung) und "live" bei Knopfdruck erfolgen.

    Tuts doch. Oder wo ist das Problem ?
    Nen anderen Weg als den Input zu faken hast du halt nicht.



  • In diesem Programm hast du eine Textbox, wo du was reinschreibst und dann auf OK klickst. Nicht wirklich geeignet zum Steuern von Spielen. Außerdem geht er erst in das eine Fenster, macht den ganzen Input, dann in das andere Fenster und macht dort den Input. Also nicht wirklich gleichzeitig.

    Input faken ist natürlich richtig. Aber so, wie es dort gemacht wird (er sendet die Zeichen aus einem Textfeld) nützt es mir nichts.



  • Emu Lator schrieb:

    Gibt es in Windows eine Möglichkeit, gleichzeitig zwei Programme mit demselben Input zu steuern?

    google mal nach
    kvm multiplexer
    und
    mouse broadcaster



  • 😕

    Was soll ich damit? Ich will zwei Fenster gleichzeitig steuern und nicht zwei komplett verschiedene Rechner.



  • Emu Lator schrieb:

    😕

    Was soll ich damit? Ich will zwei Fenster gleichzeitig steuern und nicht zwei komplett verschiedene Rechner.

    Daß diese Rückfrage kommt, war mir schon vorher klar. Das sind Sucheinstiege, weiter findest Du auch Alternativen.



  • Sag mal, willst du mich trollen?

    Ein Link zu einem Kabelverteiler soll ein Einstieg in die Suche nach einem Programm sein, das KeyDown-Events an verschiedene Fenster sendet?

    Bin ich der einzige, der diese Verbindung als totalen Schwachsinn ansieht?



  • volkard schrieb:

    google mal nach
    kvm multiplexer
    und
    mouse broadcaster

    Und das bringt genau was ? 😕

    Das Problem bei dem Thema ist, dass Windows so ausgelegt ist, dass nur das aktive Fenster den Input bekommt.
    Man kann zwar das Fenster jedesmal schnell wechseln, aber das finde ich sehr unschön.
    Die letzte Möglichkeit wäre über Messages. Dafür hab ich schnell was zusammengestrickt:

    #include <Windows.h>
    #include <vector>
    #include <string>
    
    std::vector<HWND> handlesTemp;
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	handlesTemp.push_back(hwnd);
    	return true;
    }
    
    std::vector<HWND> getAllWindows()
    {
    	handlesTemp= std::vector<HWND>();
    
    	EnumWindows(EnumWindowsProc, 0);
    
    	return handlesTemp;
    }
    
    //Adds all windows which contain 'text' in their title to our list
    void addWindow(std::vector<HWND>& windowsToUse, std::vector<HWND>& allWindows, std::string text)
    {
    	std::vector<std::string> titles;
    	for(int i=0; i < allWindows.size(); i++)
    	{
    		int textLen = SendMessage(allWindows[i], WM_GETTEXTLENGTH, 0, 0);
    		char* text = new char[textLen+1];
    		//text[textLen] = '\0';
    		SendMessageA(allWindows[i], WM_GETTEXT, textLen+1, (LPARAM)text);
    		std::string title = text;
    		delete[] text;
    		titles.push_back(title);
    	}
    
    	for(int i=0; i < allWindows.size(); i++)
    	{
    		if(titles[i].find(text) != -1)
    		{
    			windowsToUse.push_back(allWindows[i]);
    		}
    	}
    }
    
    std::vector<HWND> windowsToUse;
    
    LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    		case WM_CLOSE:
    			DestroyWindow(hWnd);
    			break;
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			break;
    		case WM_KEYDOWN:
    			for(int i=0; i < windowsToUse.size(); i++)
    			{
    				HWND topChild = GetTopWindow(windowsToUse[i]);
    				PostMessage(topChild, WM_KEYDOWN, wParam, lParam);
    			}
    			break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);		
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iCmdShow)
    {
    	std::vector<HWND> allWindows = getAllWindows();
    	addWindow(windowsToUse, allWindows, "Editor"); // Send to all windows that have "Editor" in their title
    
    	LPCTSTR className = L"MessageDistributor";
    	WNDCLASSEX wndClass = {0};
    	wndClass.cbSize = sizeof(WNDCLASSEX);
    	wndClass.lpfnWndProc = WindowProc;
    	wndClass.hInstance = hInst;
    	wndClass.lpszClassName = className;
    
    	if(!RegisterClassEx(&wndClass))
    	{
    		return 0;
    	}
    
    	HWND window = CreateWindowEx(WS_EX_APPWINDOW, className, L"Message Distributor", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, 0, 0, hInst, 0);
    	if(window == 0)
    	{
    		int err = GetLastError();
    		return 0;
    	}
    
    	ShowWindow(window, true);
    	UpdateWindow(window);
    
    	MSG message;
    	while(GetMessage(&message, 0, 0, 0) > 0 )
    	{
    		 TranslateMessage(&message);
             DispatchMessage(&message);
    	}
       return 0;
    }
    

    Ja der Code ist nicht der Schönste, aber das Prinzip sollte klar werden.
    Kurze Erklärung:

    • Alle Fenster listen
    • Nach Titel filtern und die hinzufügen die du steuern willst (Hier nur notepad.exe aka Editor)
    • Top Child Window finden (Weil das Parent sie nicht immer an das Child weiterleitet)
    • Message an alle Fenster in unserer Liste weitersenden (nicht blockierend)

    Die Handels kannst du natürlich auch anders finden. 😉

    Allerdings muss man dazu sagen, dass es eben nicht für alle Programme läuft. Je nachdem wie das Program den Input bekommt.


Log in to reply