我使用自动热键脚本来触发 GadWin ( http://www.gadwin.com/printscreen/ ) 解决了类似的问题 注意 Gadwin 仅供个人免费使用。可以购买商业许可证(25 美元)
我也有一些你可能喜欢的 C# 代码,它是免费的。
AutoHotKey 脚本:#SingleInstance Force;点击屏幕——每次点击都是一个新的屏幕截图;记录每次点击鼠标的屏幕截图;用于 Gadwin 或其他由击键触发的屏幕截图,例如 {PRINTSCREEN} ;~ 表示通过点击;键切换捕获打开和关闭
; open destination folder
destinationFolder:=GadWinDestinationFolder()
ifExist %destinationFolder%
{
Run explorer.exe %destinationFolder%
sleep 1000
}
;; shows an opening message
; TBD could be on a message box to let user choose/acknowledge
ShowStatus("Capture is Enabled.`n<Pause/Break> to toggle on/off", 10000)
; *** ,% <space> func() is autohotkey magic for interpolate a function here ***
RunWait,% GadWinExe()
sleep 5000
capturing:=true
Return
; ~ means pass the click & position through to the system
; This allows drag screens to work, while Send LButton does not
; TBS look at MouseGetPos + MouseClickDrag
~LButton::
Capture()
;Send {LButton}
return
~RButton::
Capture()
;Send {RButton}
Return
Capture()
{
global capturing
if (capturing)
{
;ClipSaved:=ClipboardAll ; Save the entire clipboard to a variable
; this may be whacking the clipboard
; alt -prt scrn
Send {PRINTSCREEN}
ShowStatus("Captured to " GadWinDestinationFolder() "`nPress <Pause/Break> to toggle.", 3000)
;Clipboard:=ClipSaved ; Restore the original clipboard. Note the use of Clipboard (not ClipboardAll).
;ClipSaved:= ; Free the memory in case the clipboard was very large.
}
Else
{
dp("Capture is off`nPress <Pause/Break> to toggle.")
}
Return
}
PAUSE:: CaptureToggle(2000)
CaptureToggle(delay)
{
global capturing
Suspend OFF
capturing:=!capturing
If (capturing)
{
ShowStatus("Capture Enabled.", delay)
}
Else
{
ShowStatus("Capture Disabled.", delay)
;Suspend
}
Return
}
GadWinExe()
{
RegRead, exeFolder, HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Gadwin PrintScreen, InstallLocation
Return exeFolder "\PrintScreen.exe"
}
GadWinDestinationFolder()
{
; Gadwin specific
RegRead, CaptureDir, HKEY_CURRENT_USER, Software\Gadwin Systems\PrintScreen\Destination, CaptureDir
Return CaptureDir
}
ShowStatus(msg, time)
{
ShowTrayTip("ClickScreen", msg, time)
}
; Generic Show and Remove Tray Tip
ShowTrayTip(title, msg, time)
{
; 7/7/2011 Win Server 2008 - 30 seems to have no effect
TrayTip, %title%, %msg%, 30, 1
SetTimer, RemoveTrayTip, %time% ; used to ensure tip is taken down
dp(msg)
Return
; The Traytip does not disappear quickly without this
; 7/7/2011 Win Server 2008 - tip disappears after 4 seconds anyway if the script continues to run
RemoveTrayTip:
SetTimer, RemoveTrayTip, Off
TrayTip
dp("TrayTip off")
Return
}
FindAndRun(exeName)
{
; Here I get to define the folders to search
ProgramFolders:="P:\Program Files,C:\Program Files,C:\Program Files (x86)"
Loop, parse, ProgramFolders, `,
{
IfExist, %A_LoopField%\%exeName%
{
Run %A_LoopField%\%exeName%
Return
}
}
MsgBox File %exeName% not found
}
dp(Msg)
{
OutputDebug %A_ScriptName% %Msg%
}
C#
using System;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
//Based on code of Agha Ali Raza (http://www.csharphelp.com/archives2/archive393.html)
namespace Script
{
public class CaptureScreen
{
const string usage = "Usage: printScreen.cs [filename]\n"+
"Captures screen image and saves it to a file (default file: screen.gif)\n";
static public void Main(string[] args)
{
if (args.Length == 1 && (args[0] == "?" || args[0] == "/?" || args[0] == "-?" || args[0].ToLower() == "help"))
{
Console.WriteLine(usage);
}
else
{
try
{
Bitmap capture = CaptureScreen.GetDesktopImage();
string file = Path.Combine(Environment.CurrentDirectory, "screen.gif");
ImageFormat format = ImageFormat.Gif;
if (args.Length == 1)
{
file = args[0];
if (args[0].ToUpper().EndsWith(".GIF"))
format = ImageFormat.Gif;
else if (args[0].ToUpper().EndsWith(".BMP"))
format = ImageFormat.Bmp;
else if (args[0].ToUpper().EndsWith(".JPEG"))
format = ImageFormat.Jpeg;
else if (args[0].ToUpper().EndsWith(".PNG"))
format = ImageFormat.Png;
}
capture.Save(file, format);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
public static Bitmap GetDesktopImage()
{
WIN32_API.SIZE size;
IntPtr hDC = WIN32_API.GetDC(WIN32_API.GetDesktopWindow());
IntPtr hMemDC = WIN32_API.CreateCompatibleDC(hDC);
size.cx = WIN32_API.GetSystemMetrics(WIN32_API.SM_CXSCREEN);
size.cy = WIN32_API.GetSystemMetrics(WIN32_API.SM_CYSCREEN);
m_HBitmap = WIN32_API.CreateCompatibleBitmap(hDC, size.cx, size.cy);
if (m_HBitmap!=IntPtr.Zero)
{
IntPtr hOld = (IntPtr) WIN32_API.SelectObject(hMemDC, m_HBitmap);
WIN32_API.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, WIN32_API.SRCCOPY);
WIN32_API.SelectObject(hMemDC, hOld);
WIN32_API.DeleteDC(hMemDC);
WIN32_API.ReleaseDC(WIN32_API.GetDesktopWindow(), hDC);
return System.Drawing.Image.FromHbitmap(m_HBitmap);
}
return null;
}
protected static IntPtr m_HBitmap;
}
public class WIN32_API
{
public struct SIZE
{
public int cx;
public int cy;
}
public const int SRCCOPY = 13369376;
public const int SM_CXSCREEN=0;
public const int SM_CYSCREEN=1;
[DllImport("gdi32.dll",EntryPoint="DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll",EntryPoint="DeleteObject")]
public static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll",EntryPoint="BitBlt")]
public static extern bool BitBlt(IntPtr hdcDest,int xDest,int yDest,int wDest,int hDest,IntPtr hdcSource,int xSrc,int ySrc,int RasterOp);
[DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport ("gdi32.dll",EntryPoint="SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);
[DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll",EntryPoint="GetDC")]
public static extern IntPtr GetDC(IntPtr ptr);
[DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
public static extern int GetSystemMetrics(int abc);
[DllImport("user32.dll",EntryPoint="GetWindowDC")]
public static extern IntPtr GetWindowDC(Int32 ptr);
[DllImport("user32.dll",EntryPoint="ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);
}
}
希望这会让你开始