Wow Idle_Mind did it all
just to add one more thing..
If you dont want to show it at all, not even in the taskbar, make it a Windows Service
Main Topics
Browse All TopicsHi,
1) I would like to have a background application that runs without any visible windows.
2) I would like this app to take a screenshot once every 5 - 60 minutes, depending on user settings, and save it to a directory. A counter in a text file will determine unique names for each bitmap.
I know I've read something about background process apps before, but I don't know how to create one. I'm also guessing sending windows a command to take a screenshot (same as hitting Print Screen button and saving the result) is pretty simple, but have no idea how to do it.
Thanks!
JP
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
It works fine, but when I run it as Windows Service, I got interop GDI+ error when calling the save function. Any idea? Thanks :Ol
Error: System.Runtime.InteropServ
at System.Drawing.Image.Save(
at System.Drawing.Image.Save(
at System.Drawing.Image.Save(
at ScreenShots.Service.takeSc
Print Screen in Vista+ will show screen shot output of Media Player provided it is not DRM content. Also the reason you get a black screen when taking a screen shot from a service is because the service runs in Session 0 which is the secure desktop so you are not going to get a picture of what is going on with the active logged on session. Your best bet for what you are doing is to create a standalone application and set the showintasktray attribute of your form to false and hige the window (.hide()). Good luck!
Business Accounts
Answer for Membership
by: Idle_MindPosted on 2004-11-05 at 16:07:48ID: 12510228
Here is an app that runs from the system tray (Be sure to set an icon for the Icon property of the NotifyIcon1 control). The files are saved in BMP format using the following naming convention:
mp
tainer
yIcon n icUpDown erStepThro ugh()> Private Sub InitializeComponent() ainer anager = New System.Resources.ResourceM anager(Get Type(Form1 )) yIcon(Me.c omponents) n icUpDown portInitia lize).Begi nInit() ms.AnchorS tyles.Top Or System.Windows.Forms.Ancho rStyles.Le ft) _ rStyles.Ri ght), System.Windows.Forms.Ancho rStyles) rStyle.Fix edSingle nment.Midd leCenter "NotifyIco n1.Icon"), System.Drawing.Icon) ms.AnchorS tyles.Top Or System.Windows.Forms.Ancho rStyles.Le ft) _ rStyles.Ri ght), System.Windows.Forms.Ancho rStyles) = New System.Drawing.Point(56, 8) = 4 nment.Midd leRight ms.AnchorS tyles.Top Or System.Windows.Forms.Ancho rStyles.Le ft) _ rStyles.Ri ght), System.Windows.Forms.Ancho rStyles) rStyle.Fix edSingle nment.Midd leCenter UpDown1) ) indowState .Minimized portInitia lize).EndI nit()
Bounds(New Point(0, 0)) mmss") & ".bmp"
) skDC, Width, Height) hTempDC, hTempBmp))
Val sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
Args) Handles t.Elapsed mericUpDow n1.Value). ToLongTime String tDateStrin g & "_" & Now.ToShortTimeString) mericUpDow n1.Value). ToLongTime String
d(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChange d mericUpDow n1.Value). ToLongTime String
Capture_05Nov2004_170441.b
If you double click the tray icon, a form will appear that will allow you to change the screen capture interval in minutes. Minimizing the form will send it back to the tray.
Hope you find it helpful,
Idle_Mind
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.ICon
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents NotifyIcon1 As System.Windows.Forms.Notif
Friend WithEvents Button1 As System.Windows.Forms.Butto
Friend WithEvents NumericUpDown1 As System.Windows.Forms.Numer
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents Label3 As System.Windows.Forms.Label
<System.Diagnostics.Debugg
Me.components = New System.ComponentModel.Cont
Dim resources As System.Resources.ResourceM
Me.Label1 = New System.Windows.Forms.Label
Me.NotifyIcon1 = New System.Windows.Forms.Notif
Me.Button1 = New System.Windows.Forms.Butto
Me.NumericUpDown1 = New System.Windows.Forms.Numer
Me.Label2 = New System.Windows.Forms.Label
Me.Label3 = New System.Windows.Forms.Label
CType(Me.NumericUpDown1, System.ComponentModel.ISup
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Anchor = CType(((System.Windows.For
Or System.Windows.Forms.Ancho
Me.Label1.BorderStyle = System.Windows.Forms.Borde
Me.Label1.Location = New System.Drawing.Point(104, 8)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(184, 24)
Me.Label1.TabIndex = 2
Me.Label1.TextAlign = System.Drawing.ContentAlig
'
'NotifyIcon1
'
Me.NotifyIcon1.Icon = CType(resources.GetObject(
Me.NotifyIcon1.Text = "Screen Capture Demo"
'
'Button1
'
Me.Button1.Anchor = CType(((System.Windows.For
Or System.Windows.Forms.Ancho
Me.Button1.Location = New System.Drawing.Point(8, 72)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(280, 24)
Me.Button1.TabIndex = 3
Me.Button1.Text = "Take ScreenShot Now"
'
'NumericUpDown1
'
Me.NumericUpDown1.Location
Me.NumericUpDown1.Maximum = New Decimal(New Integer() {60, 0, 0, 0})
Me.NumericUpDown1.Minimum = New Decimal(New Integer() {5, 0, 0, 0})
Me.NumericUpDown1.Name = "NumericUpDown1"
Me.NumericUpDown1.Size = New System.Drawing.Size(40, 20)
Me.NumericUpDown1.TabIndex
Me.NumericUpDown1.Value = New Decimal(New Integer() {5, 0, 0, 0})
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(8, 8)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(48, 24)
Me.Label2.TabIndex = 5
Me.Label2.Text = "Interval:"
Me.Label2.TextAlign = System.Drawing.ContentAlig
'
'Label3
'
Me.Label3.Anchor = CType(((System.Windows.For
Or System.Windows.Forms.Ancho
Me.Label3.BorderStyle = System.Windows.Forms.Borde
Me.Label3.Location = New System.Drawing.Point(8, 40)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(280, 24)
Me.Label3.TabIndex = 6
Me.Label3.TextAlign = System.Drawing.ContentAlig
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(296, 102)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Numeric
Me.Controls.Add(Me.Button1
Me.Controls.Add(Me.Label1)
Me.Name = "Form1"
Me.Text = "Screen Capture Demo"
Me.WindowState = System.Windows.Forms.FormW
CType(Me.NumericUpDown1, System.ComponentModel.ISup
Me.ResumeLayout(False)
End Sub
#End Region
Private Const SRCCOPY = &HCC0020
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As String) As Integer
Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Integer) As Integer
Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer) As Integer
Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Integer, ByVal hObject As Integer) As Integer
Private Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As Integer, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal Rop As Integer) As Integer
Private Declare Function DeleteObject Lib "GDI32" (ByVal hObj As Integer) As Integer
Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Integer) As Integer
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
Private loading As Boolean = True
Private WithEvents t As System.Timers.Timer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
t = New System.Timers.Timer
t.Interval = 100
t.Start()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
takeScreenShot()
End Sub
Private Sub takeScreenShot()
Dim SR As Rectangle = Screen.PrimaryScreen().Get
Dim b As Bitmap = GetScreen(SR.Left, SR.Top, SR.Width, SR.Height)
Dim imgName As String = "c:\Capture_" & Now.ToString("ddMMMyyyy_HH
b.Save(imgName)
Label3.Text = imgName
End Sub
Private Function GetScreen(ByVal X As Integer, ByVal Y As Integer, ByVal Width As Integer, ByVal Height As Integer) As Bitmap
Dim hDeskDC As Integer
Dim hTempDC As Integer
Dim hBitmap As Integer
Dim hTempBmp As Integer
Dim desktopArea As Bitmap
hDeskDC = CreateDC("DISPLAY", "", "", "")
If hDeskDC Then
hTempDC = CreateCompatibleDC(hDeskDC
If hTempDC Then
hBitmap = CreateCompatibleBitmap(hDe
If hBitmap Then
hTempBmp = SelectObject(hTempDC, hBitmap)
BitBlt(hTempDC, 0, 0, Width, Height, hDeskDC, X, Y, SRCCOPY)
desktopArea = Bitmap.FromHbitmap(New IntPtr(hBitmap))
DeleteObject(SelectObject(
End If
DeleteDC(hTempDC)
End If
DeleteDC(hDeskDC)
End If
Return desktopArea
End Function
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
If Me.WindowState = FormWindowState.Minimized Then
Me.Hide()
NotifyIcon1.Visible = True
End If
End Sub
Private Sub NotifyIcon1_DoubleClick(By
NotifyIcon1.Visible = False
Me.Show()
Me.WindowState = FormWindowState.Normal
End Sub
Private Sub t_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEvent
If loading Then
Debug.WriteLine("loading")
t.Stop()
loading = False
Me.Hide()
NotifyIcon1.Visible = True
t.Interval = NumericUpDown1.Value * 60000
Label1.Text = "Next Capture @ " & DateTime.Now.AddMinutes(Nu
t.Start()
Else
Debug.WriteLine(Now.ToShor
takeScreenShot()
t.Interval = NumericUpDown1.Value * 60000
Label1.Text = "Next Capture @ " & DateTime.Now.AddMinutes(Nu
End If
End Sub
Private Sub NumericUpDown1_ValueChange
If Not (t Is Nothing) Then
t.Interval = NumericUpDown1.Value * 60000
Label1.Text = "Next Capture @ " & DateTime.Now.AddMinutes(Nu
End If
End Sub
End Class