Naja verbuggt ist relativ.
Das is ein Schutzmechanismus von Windows, damit nicht dauernd ein lästiges Programm den Fokus klaut. Grundsätzlich sehr sinnvoll, nur immer dann elendig lästig, wenn man drumrumarbeiten muss.
Ich hatte kürzlich nen ähnlichen Fall, nur musste ich ein Fenster zuverlässig in den Vordergrund zwingen (der Input-Fokus wäre egal gewesen) - egal wie wild der User in ein anderes Fenster reingeklickt und/oder reingetippt hat.
Funktioniert hat bei mir letztlich nur BringWindowToTop. SetForegroundWindow/ActivateWindow/SetFocus waren *nicht* ausreichend. Weiss der Geier wieso.
Das mit SetFocus ist kein Schutzmechanismus und auch nicht verbuggt. Jeder Thread kann sein eigenes Focus Fenster haben und das ändert sich eben nicht wenn ein Threadcontext wechsel stattfindet...
Viele Funktionen liefern threadlokale infos. GetFocus/SetFocus gehören dazu.
Genauso wie GetCurrentDirectory prozessbezogen ist und eben auch nicht für alle Prozesse gilt.
Aber warum funktioniert das Programm nur sporadisch?
Dann muss ich da ja irgendwas falsch machen? Aber was?
Ich versteh echt nicht wieso das mit SetFocus nicht funktioniert.
Ich kann es nicht genau erläutern, es scheint aber so zu sein, dass keine richtigen Tastaturevents erzeugt werden. Es sieht so aus, als ob in einem kleinen Intervall festgestellt wird, ob die jeweilige Taste gedrückt ist oder nicht. Und wenn nach dem Tastendruck das Loslassen zu schnell kommt wird es vom Programm nicht gemerkt.
(Ich habe damit lange experimentiert)
Wenn du eine Pause zwischen dem Drücken und dem Loslassen der Taste einbaust, sollten alle Tastendrücke erkannt werden. Also in etwa so:
Besonders Programmen, die zu wenig fps haben, "übersehen" häufiger so simulierte Tastendrücke.
Warum aber keine Tastaturevents produziert werden die erst einmal zwischengespeichert werden kann ich mir nicht erklären. Eigentlich sollte es so sein. Es ist aber nicht so.
An einer Lösung des Problems bin ich auch sehr interessiert.
@Andreas XXL
Programme die die Tastatur pollen können sowas übersehen, ja.
Programme wie Notepad, die auf Window-Messages reagieren, nicht.
Kann also bei ihm nicht das Problem sein, wenn er mit Notepad testet.
Passt auch nicht zum Fehlerbild, nämlich dass der Fehler verschwindet, sobald er während seines Sleep(2000) mit der Maus in das andere Fenster reinklickt.
Heisst: das Problem ist ganz klar das Setzen des Fokus, und nicht das Generieren der Input-Events.
#include <windows>
#include <iostream>
#define MAPVK_VK_TO_VSC 0 // Ich hab hier gerade eine veraltete Entwicklungsumgebung deswegen
// das define an der Stelle ^^
#include <windows>
#include <iostream>
#define MAPVK_VK_TO_VSC 0 // Ich hab hier gerade eine veraltete Entwicklungsumgebung deswegen
// das define an der Stelle ^^
#include <windows>
#include <iostream>
#define MAPVK_VK_TO_VSC 0 // Ich hab hier gerade eine veraltete Entwicklungsumgebung deswegen
// das define an der Stelle ^^
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.