用按键机器人开发的屏幕截图
{配置
'编译时不计算结果
NoShowCalc=1
'编译时不运行程序
CompileNoRun=1
'版本号
Ver=1.03
'1.01版解决了截图后多了一个白边的问题
'1.02版截图后自动最大化
'1.03版加上验证码识别功能
'在新的进程运行
RunInNewProcess=1
配置}
{说明
屏幕截图(按F9键截屏,拖动鼠标可选择图象)
Alt+F9 启动该软件
可通过“快捷键管理”来设置该功能的快捷键
说明}
sDestopHwnd:=CallAPIs('user32.dll','GetDC','int','0'); {屏幕HDC}
ScreenBottom:=tof( GetObj('','Screen.Height') ) -1; {屏幕下边位置}
ScreenRight:= tof( GetObj('','Screen.Width' ) ) -1; {屏幕右边位置}
ScreenWidth:= GetObj('','Screen.Width'); {屏幕宽度}
ScreenHeight:= GetObj('','Screen.Height'); {屏幕高度}
xDown:=-1;{按下x位置,-1表示未按下}
yDown:=-1;{按下y位置}
xUp:=0;yUp:=0;{鼠标放开的位置}
sImageDes:='';{用于保存屏幕图象}
sFile:='';{要保存的文件名}
sAppTitle:='屏幕截图(按F9键截屏,拖动鼠标可选择图象 如果按住Ctrl键则是验证码识别)';
SetObj('','Title='+g.sAppTitle);{设置应用程序的标题}
sForm:=SetObj('','CreateForm');{新建窗口}
SetObj(sForm,'WindowState=Maximized');{窗口最大化}
SetObj(sForm,'Text='+sAppTitle);{窗口标题}
sPaintBox:=SetObj(sForm,'CreatePaintBox');{新建绘图控件}
SetObj(sPaintBox,'Left=0 Top=0 Width='+ScreenWidth+' Height='+ScreenHeight );{屏幕宽度和高度}
SetObj(sPaintBox,'OnMouseDown=按下鼠标 OnMouseUp=放开鼠标 OnMouseMove=鼠标移动 ');{鼠标事件}
SetObj(sPaintBox,'OnPaint=重画');{重画事件}
sImage:=SetObj(sForm,'CreateBitmap'); {新建位图,用于绑定屏幕图象}
SetObj(sImage,'Width=' + ScreenWidth + ' Height='+ScreenHeight );
sImageDes:=SetObj(sForm,'CreateBitmap');{新建位图,用于保存屏幕图象}
SetObj(sImageDes,'Width=' + ScreenWidth + ' Height='+ScreenHeight );
[放开鼠标;
bOk:=g.xDown !=-1 and abs(g.xDown-GetVar(1))>4 ;
iShift:=GetVar(4);
IfCall( 打开保存对话框 , ( (iShift=4 or iShift=5)=0) and bOk );{已经按下时调用“保存图片”}
IfCall( 验证码识别 , (iShift=4 or iShift=5) and bOk); {按下 Ctrl键 或 Ctrl+Shift键}
g.xDown:=-1;{-1表示未按下}
重画;
];
[保存图片;
sImageTemp:=SetObj(g.sForm,'CreateBitmap');{新建临时位图}
sTempWidth:=tos( abs(g.xUp-g.xDown) ); {设置宽度}
sTempHeight:=tos( abs(g.yUp-g.yDown) ); {设置高度}
SetObj(sImageTemp,'Width='+sTempWidth+' Height='+sTempHeight );
{复制图象(从sImageDes复制到sImageTemp)}
sRect:=tos(g.xDown)+','+tos(g.yDown)+','+tos(g.xUp)+','+tos(g.yUp);{sImageDes的区域}
sRectTemp:='0,0,' + tos(abs(g.xUp-g.xDown)) +','+ tos(abs(g.yUp-g.yDown)) ; {临时位图的区域}
SetObj(sImageTemp,'CopyRect='+sRectTemp+','+g.sImageDes+','+sRect );
SetObj(sImageTemp,'SaveToFile='+g.sFile); {保存临时位图到文件}
SetObj(sImageTemp,'Free'); {释放临时位图}
{SetObj(g.sForm,'Text='+'CopyRect='+sRectTemp+','+g.sImageDes+','+sRect);}
];
[打开保存对话框;
sSaveDialog:=SetObj(g.sForm,'CreateSaveDialog');{新建保存对话框}
SetPropValue(sSaveDialog,'Filter','(*.bmp)|*.bmp'); {指定扩展名}
SetPropValue(sSaveDialog,'DefaultExt','bmp'); {缺省扩展名}
SetObj(sSaveDialog,'Execute') ;{执行打开,返回'1'则成功,返回'0'则失败}
g.sFile:=GetPropValue(sSaveDialog,'FileName');{得到文件名}
IfCall(保存图片,g.sFile!='');
];
[验证码识别;
g.sFile:='temp.bmp';
保存图片;
SetObj('','LoadPicLib=lib');{加载所有识别库,安装目录的lib子目录}
IfCall( GetSysValue(500) ,GetVar(4)=5);{键Ctrl+Shift键时,设置“显示识别过程”}
s:=SetObj('','GetCodeFromFile='+g.sFile);
ShowMessage('验证码识别结果:'+s);
SetObj('','FreePicLib');{释放所有识别库}
GetSysValue(501);{取消“显示识别过程”}
IfCall( RunApp( GetObj('','ExePath')+'out','','') ,GetVar(4)=5);
];
[按下鼠标;
g.xDown:=GetVar(1);{按下x位置}
g.yDown:=GetVar(2);{按下y位置}
];
[鼠标移动;
IfCall(画矩形 , g.xDown!=-1 );{已经按下时 画矩形}
];
[画矩形;
g.xUp:=GetVar(1);
g.yUp:=GetVar(2);
BoundCanvas(g.sPaintBox); {绑定绘图控件}
CopyImage(g.sImageDes,0,0,g.ScreenRight,g.ScreenBottom); {从保存的图象中复制过来}
SetBrush(255,0,0,1);
Rectangle(g.xDown,g.yDown,g.xUp,g.yUp );
Draw;
];
[重画;
BoundCanvas(g.sPaintBox);
{从sImageDes复制到绘图控件sPaintBox中}
CopyImage(g.sImageDes,0,0,g.ScreenRight,g.ScreenBottom);
Draw;{画到屏幕}
];
[保存屏幕到图片;
BoundCanvas(g.sPaintBox);
SetObj(g.sImage,'Handle=' + g.sDestopHwnd); {绑定屏幕图象}
{保存屏幕图象(从sImage复制到sImageDes)}
SetObj(g.sImageDes,'CopyRect='+GetObj('','Screen.Rect')+','+g.sImage+','+GetObj('','Screen.Rect') );
{从sImageDes复制到绘图控件sPaintBox中}
CopyImage(g.sImageDes,0,0,g.ScreenRight,g.ScreenBottom);
Draw;{画到屏幕}
];
保存屏幕到图片;
SetObj(sForm,'OnShow=重画');
{**************************实现F9热键*******************************}
sAppEvents:=SetObj(sForm,'CreateApplicationEvents');{新建应用程序事件(消息)}
{ WM_HOTKEY = $0312;}{这是Dephi语言中的鼠标左键按下的常量定义,c语言也有,常量值是一样的}
{绑定热键消息(这样能提高性能),因为默认是绑定所有的消息(-1代表所有消息)}
SetObj('','BoundMessage=786'); {786是十六进制0312转换后的十进制数}
SetObj(sAppEvents,'OnMessage=我的消息'); {指定消息事件调用“我的消息”}
[我的消息;
保存屏幕到图片;{ ShowMessage('您好,您按下了F9键!');}
ActiveWindow(g.sAppTitle);
SetObj(g.sForm,'WindowState=Maximized');{窗口最大化};
];
{实现:GlobalAddAtom('MyHotKey') - $C000;}
sHotKeyAtom:=CallAPIs('kernel32.dll','GlobalAddAtomA','str','MyHotKey');{增加全局原子,主要是为了避免重复注册热键}
sHotKey:=StrAndOr(sHotKeyAtom, GetObj('C000','HexToInt') , 4{-} );
{注册一个热键F9,成功返回'1',失败'0',出错返回空串}
{这个热键绑定了sForm窗口的句柄Handle}
s:=CallAPIs('user32.dll','RegisterHotKey','int,int,int,int', GetObj(sForm,'Handle')+','+sHotKey+',0,120' );{F9键,118代表F7键}
IfCall( ShowMessage('注册热键失败') ,s!='1') ;
SetObj(sForm,'OnDestroy=释放前');
[释放前;
s:=CallAPIs('user32.dll','UnregisterHotKey','int,int', GetObj(g.sForm,'Handle')+','+g.sHotKey ); {取消注册}
s:=CallAPIs('kernel32.dll','GlobalDeleteAtom','int', g.sHotKey ); {删除全局原子}
];
{*******************************************************************}
SetObj(sForm,'Visible=2');{显示模式窗口}
SetObj(sForm,'Free');{释放窗口及子控件}