Hmmmmm. Something's wrong then, when i tried it it took ages. I put this in to take a screenshot:

Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyF1 Then
    Dim StartTime: StartTime = Timer
    Snapshot App.Path & "screenshot.jpg"
    MsgBox Timer - StartTime
  End If
End Sub
Just to make it easy for you this is my entire form code now:

vb Code:
  1. Option Explicit
  2.  
  3. Private Const COLOR_DEPTH_16_BIT As Long = D3DFMT_R5G6B5
  4. Private Const COLOR_DEPTH_24_BIT As Long = D3DFMT_A8R8G8B8
  5. Private Const COLOR_DEPTH_32_BIT As Long = D3DFMT_X8R8G8B8
  6.  
  7. Private DX As DirectX8 'The master DirectX object.
  8. Private Direct3D As Direct3D8 'Controls all things 3D.
  9. Private Direct3D_Device As Direct3DDevice8 'Represents the hardware rendering.
  10. Private Direct3DX As D3DX8
  11.  
  12. Private Direct_Input As DirectInput8
  13. Private Keyboard_Device As DirectInputDevice8
  14. Private Keyboard_State As DIKEYBOARDSTATE
  15.  
  16. Private Fullscreen_Enabled As Boolean 'Helps determine whether it's fullscreen mode.
  17. Private Running As Boolean 'Helps determine whether the main game loop is running.
  18.  
  19. Private Snapshot_Number As Long
  20. Private Snapshot_Flag As Boolean
  21.  
  22. Private Sub DirectX_Initialize()
  23.  
  24.     Dim Display_Mode As D3DDISPLAYMODE 'Display mode desciption.
  25.     Dim Direct3D_Window As D3DPRESENT_PARAMETERS 'Backbuffer and viewport description.
  26.  
  27.     Set DX = New DirectX8 'Creates the DirectX object.
  28.     Set Direct3D = DX.Direct3DCreate() 'Creates the Direct3D object using the DirectX object.
  29.     Set Direct3DX = New D3DX8
  30.    
  31.     If Fullscreen_Enabled = True Then
  32.    
  33.         'Now that we are working with fullscreen mode, we must set up the
  34.         'screen resolution to switch to, rather than use the default screen
  35.         'resolution.
  36.        
  37.         Display_Mode.Width = 800
  38.         Display_Mode.Height = 600
  39.         Display_Mode.Format = COLOR_DEPTH_16_BIT
  40.    
  41.         Direct3D_Window.Windowed = False 'The app will be in fullscreen mode.
  42.         Direct3D_Window.BackBufferCount = 1 '1 backbuffer only
  43.         Direct3D_Window.BackBufferWidth = Display_Mode.Width 'Match the backbuffer width with the display width
  44.         Direct3D_Window.BackBufferHeight = Display_Mode.Height 'Match the backbuffer height with the display height
  45.         Direct3D_Window.hDeviceWindow = frmMain.hWnd 'Use frmMain as the device window.
  46.        
  47.     Else
  48.    
  49.         Direct3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Display_Mode 'Use the current display mode that you
  50.                                                                         'are already on. Incase you are confused, I'm
  51.                                                                         'talking about your current screen resolution. ;)
  52.        
  53.         Direct3D_Window.Windowed = True 'The app will be in windowed mode.
  54.    
  55.     End If
  56.    
  57.     Direct3D_Window.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC 'Refresh when the monitor does.
  58.     Direct3D_Window.BackBufferFormat = Display_Mode.Format 'Sets the format that was retrieved into the backbuffer.
  59.    
  60.     'Creates the rendering device with some useful info, along with the info
  61.     'we've already setup for Direct3D_Window.
  62.     Set Direct3D_Device = Direct3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, Direct3D_Window)
  63.  
  64. End Sub
  65.  
  66. Private Sub DirectInput_Initialize_Keyboard(Window As Form)
  67.    
  68.     'Use in Form_Load to initialize DirectInput for Keyboard
  69.  
  70.     Set Direct_Input = DX.DirectInputCreate
  71.     Set Keyboard_Device = Direct_Input.CreateDevice("GUID_SysKeyboard")
  72.     Keyboard_Device.SetCommonDataFormat DIFORMAT_KEYBOARD
  73.     Keyboard_Device.SetCooperativeLevel Window.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
  74.     Keyboard_Device.Acquire
  75.     Keyboard_Device.GetDeviceStateKeyboard Keyboard_State
  76.  
  77. End Sub
  78.  
  79. Private Function DirectInput_Key_State(Key_Code As Long) As Long
  80.    
  81.     'Use during your game loop to check for keys pressed. DO NOT USE Keycodes.
  82.     'Only use DIK_ variables and the appropriate key.
  83.     Keyboard_Device.GetDeviceStateKeyboard Keyboard_State
  84.    
  85.     DirectInput_Key_State = Keyboard_State.Key(Key_Code)
  86.  
  87. End Function
  88.  
  89. Private Sub Keyboard_Controls()
  90.    
  91.     If DirectInput_Key_State(DIK_SYSRQ) <> 0 Then
  92.         If Snapshot_Flag = False Then
  93.             Snapshot_Flag = True
  94.             If Dir$(App.Path & "\Snapshots\", vbDirectory) = "" Then
  95.                 MkDir App.Path & "\Snapshots\"
  96.             End If
  97.            
  98.             If Dir$(App.Path & "\Snapshots\SNAP" & Format(Snapshot_Number, "####") & ".bmp") = "" Then
  99.                 Snapshot App.Path & "\Snapshots\SNAP" & Format(Snapshot_Number, "####") & ".bmp"
  100.             End If
  101.            
  102.             While Dir$(App.Path & "\Snapshots\SNAP" & Format(Snapshot_Number, "####") & ".bmp") <> ""
  103.                 DoEvents
  104.                 Snapshot_Number = Snapshot_Number + 1
  105.             Wend
  106.         End If
  107.     ElseIf DirectInput_Key_State(DIK_SYSRQ) = 0 Then
  108.         Snapshot_Flag = False
  109.     End If
  110.  
  111. End Sub
  112.  
  113. Private Sub Snapshot(ByVal File_Path As String)
  114.  
  115.     Dim Surface As Direct3DSurface8
  116.     Dim SrcPalette As PALETTEENTRY
  117.     Dim SrcRect As RECT
  118.     Dim Direct3D_Display_Mode As D3DDISPLAYMODE
  119.  
  120.     'get display dimensions
  121.     Direct3D_Device.GetDisplayMode Direct3D_Display_Mode
  122.  
  123.     'create a surface to put front buffer on,
  124.     'GetFrontBuffer always returns D3DFMT_A8R8G8B8
  125.     Set Surface = Direct3D_Device.CreateImageSurface(Direct3D_Display_Mode.Width, Direct3D_Display_Mode.Height, D3DFMT_A8R8G8B8)
  126.  
  127.     'get data from front buffer
  128.     Direct3D_Device.GetFrontBuffer Surface
  129.  
  130.     'we are saving entire area of this surface
  131.    
  132.     With SrcRect
  133.    
  134.         .Left = 0
  135.         .Right = Direct3D_Display_Mode.Width
  136.         .Top = 0
  137.         .bottom = Direct3D_Display_Mode.Height
  138.        
  139.     End With
  140.  
  141.     'save this surface to a BMP file
  142.     Direct3DX.SaveSurfaceToFile File_Path, D3DXIFF_BMP, Surface, SrcPalette, SrcRect
  143.  
  144. End Sub
  145.  
  146. Private Sub Game_Loop()
  147.  
  148.     Do While Running = True
  149.        
  150.         Keyboard_Controls
  151.        
  152.         'Clears the backbuffer.
  153.         Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0
  154.        
  155.             'Rendering code goes here, but in this tutorial, it will be empty for now.
  156.        
  157.         'Flips the backbuffer into the form window.
  158.         Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
  159.        
  160.         If DirectInput_Key_State(DIK_ESCAPE) Then  'If the user presses the Esc key...
  161.             Shut_Down
  162.         End If
  163.        
  164.         DoEvents 'Allow events to happen so the program doesn't lock up.
  165.                  'Found out the hardway that it must be at the end of
  166.                  'the loop if you plan to exit out of the program
  167.                  'properly without using End
  168.  
  169.     Loop
  170.  
  171. End Sub
  172.  
  173. Private Sub Main()
  174.  
  175.     'This event will fire before the form has completely loaded
  176.    
  177.     If MsgBox("Click Yes to go to full screen (Recommended)", vbQuestion Or vbYesNo, "Options") = vbYes Then Fullscreen_Enabled = True
  178.    
  179.     Me.Show
  180.  
  181.     frmMain.Caption = "DirectX Tutorial"
  182.    
  183.     DirectX_Initialize
  184.     DirectInput_Initialize_Keyboard frmMain
  185.  
  186.     Running = True 'Initializations all set. It's now ok to activate the game loop.
  187.  
  188.     Game_Loop
  189.    
  190. End Sub
  191.  
  192. Private Sub Shut_Down()
  193.  
  194.     Running = False 'Helps the program bail out of the game loop.
  195.    
  196.     'Unload all of the DirectX objects
  197.    
  198.     Set Direct_Input = Nothing
  199.     Set Direct3D_Device = Nothing
  200.     Set Direct3D = Nothing
  201.     Set DX = Nothing
  202.    
  203.     Unload Me 'Unload the form
  204.  
  205. End Sub
  206.  
  207. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  208.   If KeyCode = vbKeyF1 Then
  209.     Dim StartTime: StartTime = Timer
  210.     Snapshot App.Path & "screenshot.jpg"
  211.     MsgBox Timer - StartTime
  212.   End If
  213. End Sub
  214.  
  215. Private Sub Form_Load()
  216.  
  217.     Main
  218.  
  219. End Sub
  220.  
  221. Private Sub Form_Unload(Cancel As Integer)
  222.  
  223.     Shut_Down
  224.    
  225. End Sub

For some reason when i take a screenshot it spends 1.3 seconds doing so. The part where it spends all the time is on this line in the screenshot sub: "Direct3D_Device.GetFrontBuffer Surface"


As for the clipping i'm sorry that i can't help you . When it comes to directx you're the boss, i would have no idea how to do that.