我使用AutoHotkey的脚本触发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);
}
}
希望这将得到钥匙切换捕捉你开始
BTW ...令我惊讶的是(在进一步阅读之后),我在Win7中遇到了一个名为psr.exe的内置工具,它完全符合我上面提到的内容,但它将输出保存在.mht中,并且图像在该区域附近有一些华丽的图形点击鼠标的地方。 – 2013-05-05 07:14:24