Endlosschleife funktioniert falsch



  • Hallo zusammen,

    ich brauch doch noch mal bitte Eure Hilfe.

    Was habe ich vor:

    Eine Endlosschleife, die im Hintergund nach einem bestimmten Fenster sucht und dann an einer bestimmten Stelle einen MouseClick macht.

    Leider ist es zur Zeit so, dass der immer klickt, auch wenn das Fenster nicht da ist. Kann mir da bitte einer helfen??? 😞

    #include <windows.h>
    
    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    POINT p ;
    int m1 = 65535 / 480;
    int m2 = 65535 / 272;
    p.x = 460;
    p.y = 255;
    int x = m1 * p.x;
    int y = m2 * p.y;   
    HWND hwnd;
    
    /* Always check first if program is already running */
    hwnd = FindWindow( NULL, L"Prototype");
    	if (hwnd)
    		{
    		DestroyWindow(hwnd);
    		}
    	while(1)
    		{
    		hwnd = FindWindow(NULL, L"GoPalSettings_np");
    		if (!hwnd) 
    			{
    			Sleep(3000);
    			mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    			Sleep(10);
    			mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    			}
    		else
    			{
    			Sleep(5000);
    			}
    		}
    return 0;
    }
    


  • Vielleicht statt

    if (!hwnd)
    
    if (hwnd)
    

    ?
    Du bist jedenfalls hier im falschen Forum...



  • Heya,

    ohne Dein Prob weiter angesehen zu haben, Du gehörst damit --> WinAPI



  • keine Ahnung, ob wir dir helfen können. Funktionen wie FindWindow, mouse_event usw. sind nicht im ANSI-C definiert.



  • Sorry,

    natürlich hab ich das auch probiert.
    Aber wieso im falschen Forum?

    Edit:

    ups... sorry, aber auf die Idee bin ich noch nicht gekommen, dass das mit der API klemmt?!?



  • Naja im falschen Teilforum... 😉

    Aber MSDN sagt mir, dass FindWindow 0 zurückgibt, wenn er nix findet. Also müsste so weit ich das verstehe das '!' weg.



  • Das ist es leider nicht...
    Jetzt klickt es garnicht mehr.



  • Hallo zusammen,

    noch mal ein Danke für Eure Hilfe. 👍

    Auch wenn der gesamte Thread im falschen Unterforum platziert ist, hier dann doch noch mal meine Lösung....

    Vorab: Wenn man nach dem richtigen Fensternamen sucht, geht das Script auch... 🤡

    Dann tat sich allerdings noch eine weitere Schwierigkeit auf.
    Dummerweise wird der gleiche Fenstername auch noch für ein weiteres Fenster benutzt, was aus der gleichen Exe kommt.

    Ein Klick an der Stelle in dem anderen Fenster hätte aber fatale Folgen, weil das einen Reset auf Werkseinstellungen zur Folge hätte.

    Also hab ich überlegt, wie ich diese beiden Fenster unterscheiden könnte und habe dann mit GetPixel einen einzigen wirklichen Farb-Unterschied finden können. Jedenfalls funktioniert das Tool so wie ich das haben wollte... 🙂

    Vielleicht hat jemand die Musse und schaut sich das mal bitte an, ob es da möglicherweise eine elegantere Lösung gibt... bin ja noch blutiger Anfänger mit AnsiC und erst recht mit API-Programmierung.

    #include <windows.h>
    
    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow)
    {
    POINT p ;
    int m1 = 65535 / 480;
    int m2 = 65535 / 272;
    p.x = 460;
    p.y = 255;
    int x = m1 * p.x;
    int y = m2 * p.y;   
    HWND hwnd;
    HDC dc = GetDC(NULL);
    
    /* Look if programm is running */
    hwnd = FindWindow( NULL, L"Prototype");
    	if (hwnd)
    		{
    		DestroyWindow(hwnd);
    		}
    
    /* Endless loop, to wait for GoPalSettings */
    	while(1)
    		{
    		hwnd=FindWindow(NULL, L"GoPalSettings");
    		if(hwnd)
    			{
    			if (GetPixel(dc, 462, 236) == GetPixel(dc, 462, 250))
    				{
    				Sleep(3000);
    				mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    				Sleep(100);
    				mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    				hwnd = NULL;
    				Sleep(5000);
    				}
    			else 			/* else for minimizing CPU usage*/
    				{
    				Sleep(5000);
    				}
    			}
    		else			/* else for minimizing CPU usage*/
    			{
    			Sleep(5000);
    			}
    		}
    
    return 0;
    }
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • erklär doch mal genauer was du machen willst - die jetzige Lösung sieht doch etwas 'unschön' aus.



  • Fragen / Hinweise
    1. Wo ist das hwnd von WinMain? Üblicherweise mit CreateWindow() eingerichtet.
    2. Wozu eine bewusst programmierte Endlosschleife? Für den Abbruch aus einer Schleife gibt es bessere Möglichkeiten.
    3. Ob bereits eine Instanz des Programmes läuft, ist so nicht feststellbar.
    4. WinMain sollte weitestmöglich von WinApi-fremden Aufgaben freigehalten werden.
    5. Was ist der Zweck des Vorhabens?



  • Hallo,
    danke für Eure Antworten... bin zwar schon was älter, aber versuche mich da reinzuwurschteln...

    Ok... hab den Abschnitt aus einer vorherigen App übernommen, in dem ein Fenster benötigt wird... kann ich raus nehmen... stimmt... 👍

    Der Sinn der Übung ist, eine kleine Exe im Hintergrund laufen zu haben, die abpüft, ob das Fenster hoch kommt.

    Hintergrund:

    Beim Start des PNA wird ein Fenster geöffnet, was man bestätigen muss (klick). Da das auch bei jedem Aufwecken aus dem Standby kommt, muss mein Programm schon im Speicher stecken. Beendet wird das eigentlich nur dann, wenn der Benutzer dies explizit ausschaltet, was ich über eine externe Exe geregelt habe. deswegen habe ich keinen Abbruch der Schleife.

    Das Finden der Pixel wird benötigt, da unter gleichem Fensternamen die selbe Exe die Systemeinstellungen aufruft. Wenn da der Klick kommen sollte, wird nach Rückfrage das Gerät auf Werkseinstellungen zurück gesetzt. Das wäre sehr unschön... 😕



  • Wenn ich das richtig verstehe, hast du 2 EXE - die hier vorgestellte und eine andere. Die 2. EXE soll die Steuerung der 1. EXE übernehmen und irgendetwas mit Systemeinstellungen machen? Das ist dann aber nicht so einfach machbar. Dafür wäre aus meiner Sicht das Austauschen von Nachrichten mit SendMessage() oder Inter-Process-Communication (IPC) wohl erforderlich.



  • Hallo,

    berniebutt schrieb:

    Wenn ich das richtig verstehe, hast du 2 EXE - die hier vorgestellte und eine andere. Die 2. EXE soll die Steuerung der 1. EXE übernehmen...

    nein, das ist viel einfacher...

    Der Startaufruf für mein hier gezeigtes Script "AutoFMT.exe" kommt aus einer Gopal-internen Startroutine, einer sogenannten *.lua, die bei jedem Booten des PNA durchlaufen wird, ähnlich des Autostart-Ordners, nur komplizierter und umfangreicher...

    Meine "FMT_Switcher.Exe" enthält 3 Buttons.

    Button1 = Einschalten ---> verschiebt die "Restore_AutoFMT.exe" aus der Sicherung in den dazugehörigen Ordner als "AutoFMT.exe , löst einen Softreset aus und das Script startet mit dem PNA automatisch mit.

    Button2 = Ausschalten ---> holt sich den handle zum Prozess "AutoFMT.exe", schliesst diese, verschiebt die AutoFMT.exe wieder in den Sicherungs-Ordner als "Restore_AutoFMT.exe" und löst einen Softreset aus.

    Der 3. Button schliesst das Programm ohne Änderung.

    Selbstverständlich sind beide Funktions-Buttons mit einer Sicherungsroutine versehen.

    berniebutt schrieb:

    ...und irgendetwas mit Systemeinstellungen machen?

    Nein, da hab ich mich wohl missverständlich ausgedrückt... Sorry! 😕

    In der AutoFMT.exe musste ich zusätzlich zu der Abfrage nach dem Fenster auch noch die Pixelfarbe vergleichen, weil ansonsten die Suche nur nach dem Fenster, ein anderes Fenster mit gleichem Namen auch geklickt würde. Das hätte aber zur Folge gehabt, dass ein Rücksetzen auf Werkseinstellungen geklickt würde, was natürlich verhindert werden musste. aus diesem Grund in meinem vorgestellten Script die zusätzliche Abfrage nach der Farbe und dem Vergleich mit der Farbe an anderer Stelle des Fensters.

    Gruß
    Peter



  • was ist PNA und Gopal? Würde es vieleicht einfacher machen zu Helfen.



  • Sorry,

    PNA ist ein Pocket-Navigations-Gerät, mit CE 5-Core, allerdings deutlich eingestampft, z.B. ohne AYGSHELL.dll und noch ein paar anderer fehlender Sachen.

    GoPal ist die darauf laufende Navigations-Software.



  • Du schreibst als ein Programm für Windows CE!?.



  • ganz genau so ist das.



  • Hallo nochmal.

    Was würdet Ihr denn an meinem Script ändern wollen?

    Ich versuche ja dazu zu lernen. Es funktioniert ja, aber wenn man das eleganter und schöner machen könnte, wäre mir ja auch schon geholfen...

    Mal was zum Hintergrund der von mir erstellten kleinen C-Proggies:

    Wir betreiben ein nichtkommerzielles Forum für Navigationsgeräte und stellen unseren Usern Installations-Programme und Skins kostenlos zur Verfügung. Da wir uns auf die Fahne geschrieben haben, dass alles für den User einfach und problemlos installierbar sein soll, sind wir von MortScript auf Pelles C umgestiegen, da .NET leider auf den kleinen Geräten nicht installierbar ist. Ausserdem sind wir so auch ein wenig gegen Ideendiebstahl geschützt, wenn man keine offenen Scriptdateien zur Verfügung stellen muss. Wen interessiert was wir machen... Link ist in meinem Profil. 😉

    Unsere Installer schreibe ich mit AutoIt, die Apps, die auf dem Navi laufen sind alle in C geschrieben, da die sehr klein sind und eigentlich problemfrei laufen.

    Wie gesagt... ich bin dabei mich vernünftig in die Materie einzuarbeiten und bin für Hilfe dabei ausserordentlich dankbar. Klar... ich mache noch sehr viele Fehler, aber bisher habe ich noch alles ans Laufen bekommen, auch wenn es länger dauert... 😉



  • ka ob das in WinCE geht, aber ich würde eine DLL in den Zielprozess injizieren um die entsprechenden Fensterprozeduren zu hooken. Damit hätt man dann die voll Kontrolle über die Fenster.


Anmelden zum Antworten