windows - Er der en programmatisk måde at opdage, hvis processen kan interagere med skrivebordet

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en eksekverbar, der kan køre normalt eller som service. Ved opstart kan det vise en fejlmeddelelse, hvis der er en fejl (ved hjælp af MessageBox api). Dette kan forårsage fejl, hvis applikationen kører som tjeneste, men ikke tilladt at interagere med skrivebordet. Processen ser ud til at være hængende. Er der en programmatisk måde at opdage, om applikationen kan interagere med skrivebordet? Jeg kan derefter bruge en anden fejlmeddelelsesmekanisme (logfil osv.)

Bedste reference


Fra MSDN: [4]



  For at afgøre, om en tjeneste kører som en interaktiv tjeneste,
  kalder funktionen GetProcessWindowStation for at hente et håndtag til
  vinduestation og GetUserObjectInformation-funktionen til at teste
  om vinduestationen har WSF\_VISIBLE attributten.



I .NET kan du bruge Environment.UserInteractive [5]



  Egenskaben UserInteractive rapporterer ikke for en Windows-proces eller en
  service som IIS, der kører uden brugergrænseflade. Hvis denne ejendom
  er falsk, skal du ikke vise modale dialoger eller meddelelsesbokse fordi der
  er ingen grafisk brugergrænseflade for brugeren at interagere med.


Andre referencer 1


Du kunne angive MB\_SERVICE\_NOTIFICATION, når du ringer MessageBox(), som viser meddelelsen i den aktuelt aktive session.


Men , er det ikke, hvad du virkelig vil have, at vise en meddelelsesboks fra en tjeneste.


Tjenester skal køre i baggrunden og ikke interagere direkte med brugerne. Et af deres egenskaber er, at de kan (og ofte gør) køre selv når ingen brugere er logget på. I Windows Vista kører de endda i en helt anden session end alle andre brugere. 'At vise en MessageBox kan resultere i, at dine tjenester bliver blokeret, fordi meddelelsen blev påkaldt i din tjeneste s egen session uden at brugeren vidste det.


Skrivning til en slags logfil eller brug af Windows 'EventLog er den foretrukne metode.

Andre referencer 2


Fra http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx:[6]


For at afgøre, om en tjeneste kører som en interaktiv tjeneste, skal du ringe til GetProcessWindowStation-funktionen for at hente et håndtag til vinduestationen og funktionen GetUserObjectInformation for at teste om vinduestationen har WSF\_VISIBLE-attributten.