As described...
Option Strict On Option Explicit On Imports System.Runtime.InteropServices Public Class Form1 Private Const WH_KEYBOARD_LL As Integer = 13 Private Const WM_KEYUP As Integer = &H101 Private Const WM_SYSKEYUP As Integer = &H105 Private proc As LowLevelKeyboardProcDelegate = AddressOf HookCallback Private hookID As IntPtr Private Delegate Function LowLevelKeyboardProcDelegate(ByVal nCode As Integer, ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As IntPtr <DllImport("user32")> _ Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProcDelegate, _ ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr End Function <DllImport("user32.dll")> _ Private Shared Function UnhookWindowsHookEx(ByVal hhk As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function <DllImport("user32.dll")> _ Private Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As IntPtr End Function <DllImport("kernel32.dll", CharSet:=CharSet.Unicode)> _ Private Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr End Function Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. hookID = SetHook(proc) End Sub Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing UnhookWindowsHookEx(hookID) End Sub Private Function SetHook(ByVal proc As LowLevelKeyboardProcDelegate) As IntPtr Using curProcess As Process = Process.GetCurrentProcess() Using curModule As ProcessModule = curProcess.MainModule Return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0) End Using End Using End Function Private Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr ' we check keyup for standard printscreen, and syskeyup incase it is alt+printscreen ' we aren't checking keydown, as that fires before the screenshot is taken. If nCode >= 0 AndAlso (wParam.ToInt32 = WM_KEYUP OrElse wParam.ToInt32 = WM_SYSKEYUP) Then Dim vkCode As Integer = Marshal.ReadInt32(lParam) If vkCode = Keys.PrintScreen Then Dim data As IDataObject = Clipboard.GetDataObject() If data.GetDataPresent(GetType(Bitmap)) Then Me.BackgroundImage = DirectCast(data.GetData(GetType(Bitmap)), Bitmap) End If End If End If Return CallNextHookEx(hookID, nCode, wParam, lParam) End Function End Class