python - Sådan tegnes en meddelelse på skærmen, der ikke tager fokus og forbliver altid på toppen (Windows)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at finde en måde at tegne noget på skærmen, der viser oven på alt andet, der kører (selv fuldskærmsprogrammer), men vil ikke stjæle fokus eller fungere som en normal applikation eller et vindue. Det skal være rent visuel og ikke forstyrre på nogen anden måde.


Python er at foretrække.


Det jeg målretter mod, er at kunne få mit python script til at vise en besked på skærmen, muligvis bare en del tekst (gennemsigtig baggrund) og for at vise frem for alt andet du gør på det tidspunkt.


Jeg har prøvet wxpython, men enten vinduet stjæler fokus, eller jeg bruger tricket til ikke at stjæle fokus, og det ser ikke ud for mine fuldskærmsprogrammer. Det føles som om wxpython ikke er rigtig lavet til det jeg vil gøre, da det ikke skulle være en GUI, skulle det bare være en meddelelse, der vises midlertidigt og ikke bruger input.

Bedste reference


Generelt kan du ikke skrive en ansøgning, der garanterer at holde sig på toppen af ​​andre applikationer, der ønsker at forblive på toppen af ​​andre applikationer.



  • http://blogs.msdn.com/b/oldnewthing/archive/2011/03/10/10138969.aspx



Da et fuldskærmsprogram er et vindue, der er øverst, er der ingen måde for OS at vide, at dit øverste vindue skal være topmoster end det andet øverste vindue. [7]


Ideelt set bør du finde en måde at samarbejde med den anden applikation på.


Men her er nogle tricks du kan prøve, hvilket kan fungere for nogle situationer:



  • Du skal sandsynligvis bruge Win32 API direkte.

  • Aktiver ikke dit vindue ved hjælp af SetActive, brug bare SetWindowPos med SWP\_NOACTIVATE
    og HWND\_TOPMOST for at flytte den til forsiden uden at aktivere.

  • Prøv at indstille dit vindue til deaktiveret, så det kan ikke stjæle fokuset, hvilket er halvdelen af ​​problemet.

  • Du skal muligvis indstille SPI\_SETFOREGROUNDLOCKTIMEOUT i SystemParametersInfo til en lille værdi.

  • Du må muligvis forsøge forgrunden gentagne gange, indtil du får det.



Bemærk, at disse tricks ikke hjælper, hvis det andet vindue gør det samme.


Nyttig dokumentaion her:



  • SetWindowPos: http://msdn.microsoft.com/en-us/library/aa931583.aspx

  • SetForegroundWindow: http://msdn.microsoft.com/en-us/library/ms633539 (VS.85) .aspx

  • SystemParametersInfo: http://msdn.microsoft.com/en-us/library/ms724947 (VS.85) .aspx


Andre referencer 1


Hvis Qt er en mulighed, kan du prøve at bruge attributten Qt::WA\_ShowWithoutActivating som foreslået i dette spørgsmål. [8] [9] [10] [11]