code verbessern
-
hi,
hab mir ein kleines Marco geschrieben, funktioniert ist aber nicht schön.
Besonders das Sleep() gefällt mir nicht. Gibt es eine Möglichkeit das er nur solange wartet bis die vorherige Zeile komplett ausgeführt ist? Was kann man sonst noch verbessern?Das Programm öffnet Wiedergabegeräte und aktiviert entweder mein Headset oder die Boxen als Standard Anwendung.
Hier der code:
#include <windows.h> #include <fstream> using namespace std; int main(int argc, char *argv[]) { //Variablendeff. HWND handle; ifstream f; string s; f.open("test.dat", ios::in); // Öffne Datei aus Parameter getline(f, s); // Lese eine Zeile f.close(); // Datei wieder schließen system("D:\\Programierzeug\\Ager.lnk"); //Öffen der Verknüpfung Sleep(200); //warte bis geöffnet wurde handle = FindWindow(NULL,"sound"); //finde Fenster Sleep(100); SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund Sleep(100); RECT *rect = (RECT*)malloc(sizeof(RECT)); //ermittle Posiotion des Fensters GetWindowRect(handle,rect); int i = atoi(s.c_str()); //string to int if(i == 1) { //Lautsprecher SetCursorPos(rect->left+164, rect->top+180); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(rect->left+241, rect->top+393); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(rect->left+196, rect->top+435); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); fstream f; f.open("test.dat", ios::out); f << "2" << endl; //speichern in test.dat f.close(); } .....
-
Geht mit reinem C++ nicht, ich verschieb Dich mal nach WinAPI.
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum 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.
-
Sagexs schrieb:
Gibt es eine Möglichkeit das er nur solange wartet bis die vorherige Zeile komplett ausgeführt ist?
ein thread läuft immer sequenziell, die zweile zeile wird immer nach der ersten
ausgeführt, oder wie meinst du das?Sleep(200); //warte bis geöffnet wurde handle = FindWindow(NULL,"sound"); //finde Fenster Sleep(100);das kannst du wohl optimieren:
while (!handle = FindWindow(0, "sound")) Sleep(100);nachdem du das handle hast, musst du nicht warten, sondern kannst sofort
weitermachen.
-
Sleep lässt einen Prozess für die angegebene Zeit - wie der Name sagt - vollständig schlafen. Er tut also in dieser Zeit nichts und gibt die Performance während dieser Zeit an andere Prozesse frei. Was du willst ist etwas anderes. Du brauchst wahrscheinlich einen Timer, der zurückmeldet, wann irgendetwas erledigt ist und dann weitergearbeit werden kann.
-
natürlich werden sie der reihe nach ausgeführt, das Problem ist eher das der Rechner nicht hinterher kommt, z.B öffnet sich das Fenster der Wiedergabegeräte erst nach dem die ganzen Klicks ausgeführt wurden, oder aber ehr setzt das Fenster nicht rechtzeitig in den Vordergrund, etc ...
deswegen habe ich die "Sleep()" dazwischen gesetzt. Leider braucht der Rechner jedes mal Unterschielich viel zeit um die einzelnen Sachen zu laden. Kann ich nicht überprüfen ob die Aktion ausgeführt und beendet wurde bevor die nächste anfängt?
-
Das alles kann man mit WinApi-Funktionen steuern, nur Sleep ist das falsche Werkzeug dafür, weil du nicht wissen kannst, wielange etwas dauert. SendMessage
wäre auch etwas geeignetes für dich. Dann bestimmst du selbst nach Erhalt der Nachricht, wann etwas laufen kann und soll.
Edit: Möglicherweise brauchst du aber auch das nicht, wenn Windows das selbst erledigen kann. Der Programmablauf mit Windows ist eben ereignisgesteuert.
-
das kannst du wohl optimieren:
while (!handle = FindWindow(0, "sound")) Sleep(100);nachdem du das handle hast, musst du nicht warten, sondern kannst sofort
weitermachen.Das sollte eigentlich auch ohne sleep funktionieren.
while (!handle = FindWindow(0, "sound"));dann weiter:
SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund while (GetForegroundWindow() != handle));
-
erst einmal danke für euere hilfe.
[quote="manner"]
Das sollte eigentlich auch ohne sleep funktionieren.
while (!handle = FindWindow(0, "sound"));dann weiter:
SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund while (GetForegroundWindow() != handle));Funktioniert bei mir beides leider nicht.
zum ersten: non-vlaue in assignment
so würde es gehen, bin mir aber nicht sicher ob es das gleiche ist:while (!handle){handle = FindWindow(NULL, "sound");}beim zweiten: geht er bei mir nicht aus der schleife raus.
-
Sagexs schrieb:
Funktioniert bei mir beides leider nicht.
zum ersten: non-vlaue in assignment
so würde es gehen, bin mir aber nicht sicher ob es das gleiche ist:while (!handle){handle = FindWindow(NULL, "sound");}Stimmt, so geht´s besser.
beim zweiten: geht er bei mir nicht aus der schleife raus.
probier´s nochmal so:
while (!GetForegroundWindow() == handle);theoretisch sollte es gehen, hab´s jetzt aber nich ausprobiert
-
juhuuuu ich habs gelöst

while (GetForegroundWindow() != FindWindow(NULL, "sound")) { SetForegroundWindow(FindWindow(NULL, "sound")); }Das Problem war, das er die Adressen in der zeile
while (!GetForegroundWindow() == handle);verglichen hat. Handle war dabei immer ungleich GetForegroundWindow.
Danke für eure Hilfe :D. Bis zum nächsten Problem!