Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Screenshot of process under Windows Service

We have to run a process from a windows service and get a screenshot from it.

We tried the BitBlt and PrintWindow Win32 calls, but both give blank (black) bitmaps.

If we run our code from a normal user process, it works just fine.

Is this something that is even possible? Or could there be another method to try?

Things we tried:

  1. Windows service running as Local System, runs process as Local System -> screenshot fails
  2. Windows service running as Administrator, runs process as Administrator -> screenshot fails.
  3. Windows application running as user XYZ, runs a process as XYZ -> screenshot works with both BitBlt or PrintWindow.
  4. Tried checking "Allow service to interact with desktop" from Local System

We also noticed that PrintWindow works better for our case, it works if the window is behind another window.

For other requirements, both the parent and child processes must be under the same user. We can't really use impersonation from one process to another.

like image 774
jonathanpeppers Avatar asked Sep 18 '09 17:09

jonathanpeppers


People also ask

How do I take a screenshot of just the active window?

Copy only the image of the active window Click the window that you want to copy. Press ALT+PRINT SCREEN. Paste (CTRL+V) the image into an Office program or other application.

How do I force a screenshot in Windows 10?

Alt + Print Screen To take a quick screenshot of the active window, use the keyboard shortcut Alt + PrtScn. This will snap your currently active window and copy the screenshot to the clipboard. You'll need to open the shot in an image editor to save it.


2 Answers

Currently i can't find the corresponding links, but the problem is, that a windows service runs in another session than a normal user application.

In XP this was not fully true. Here are all services started in Session 0 and the first user who logs into the system will also run in Session 0. So in that case, tricks like Allow service to interact with desktop work. But if you fast switch to another user he gets the Session 1 and has no chance to interact with the service directly. This is also true if you connect through RDP to a server version (like 2003 or 2008). These logins will also start in a session higher than 0.

Last but not least there is another drawback by using the interaction with the desktop:
If you enable this option and your service is running under the (default) SYSTEM account it won't be able to create a network connection anymore.

The correct way to get a custom GUI that works with a service is to separate them into two processes and do some kind of IPC (inter process communication). So the service will startup when the machine comes up and a GUI application will be started in the user session. In that case the GUI can create a screenshot, send it to the service and the service can do with it, whatever you like.

like image 163
Oliver Avatar answered Sep 30 '22 00:09

Oliver


Have you tried to run as Local System with the "Allow service to interact with desktop" checked?

like image 36
esac Avatar answered Sep 30 '22 02:09

esac