请都市夜猫老师看一下截屏打印的问题

kmyz_yyl 2020-07-11 04:16:33
* 这段代码是网上找的,据说是都市夜猫老师的代码,请帮看一下代码没有执行的原因,我主要是想实现打印鼠标点击图片就直接打印,请老师指点!

DECLARE INTEGER FindWindow IN user32 STRING lpClassName,STRING lpWindowName
DECLARE INTEGER GetDC IN user32 INTEGER hwnd
Declare SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect
DECLARE Long GetWindowDC IN WIN32API Long hWnd
DECLARE Long ReleaseDC IN WIN32API Long hWnd, Long hDc
DECLARE Long CreateCompatibleDC IN WIN32API Long hDc
DECLARE Long DeleteDC IN WIN32API Long hDc
DECLARE Long CreateCompatibleBitmap IN WIN32API Long hDc, Long nWidth, Long nHeight
DECLARE Long BitBlt IN WIN32API Long hDestDC, Long nXDest, Long nYDest, Long nWidth, Long nHeight, Long hSrcDC, Long nXSrc, Long nYSrc, Long dwRop
DECLARE Long SelectObject IN WIN32API Long hDc, Long hObject
DECLARE Long DeleteObject IN WIN32API Long hObject
DECLARE Long GdiplusStartup IN gdiplus Long @ token, String @ inputbuf, Long @ outputbuf
DECLARE Long GdiplusShutdown IN gdiplus Long token
DECLARE Long GdipCreateBitmapFromHBITMAP IN gdiplus Long hbitmap, Long hpalette, Long @ hGpBitmap
DECLARE Long GdipDisposeImage IN gdiplus Long image
DECLARE Long GdipSaveImageToFile IN gdiplus Long nImage, String FileName, String clsIdEncoder, Long encoderParams

**以上的API 不是全部用上 只是复制进来,懒得删除了!
DECLARE INTEGER PrintWindow IN user32 INTEGER,INTEGER ,INTEGER

#define SRCCOPY 0x00CC0020 LOCAL cFileExtName, cEncoder, iInputBuf, iResult
LOCAL hDesktopDc, hVDc, hBitmap, hToken, hGdipBitmap
m.hWnd=FindWindow("Notepad",NULL) &&截取一个文本窗口试一试
tcFile=LOWER('d:\aaa.JPG') &&jpg 格式图像
m.cFileExtName =LOWER( JUSTEXT( m.tcFile ))
lpRect = REPLI (Chr(0), 16)
GetWindowRect (m.hWnd, @lpRect)
lnWidth=ctob(SUBS(lpRect,9,4),'4rs')-ctob(SUBS(lpRect,1,4),'4rs')&&窗口宽度
lnHeight=ctob(SUBS(lpRect,13,4),'4rs')-ctob(SUBS(lpRect,5,4),'4rs')&&窗口高度

m.hDesktopDc = GetDC( m.hWnd )
m.hVdc = CreateCompatibleDC( m.hDesktopDc )
m.hBitmap = CreateCompatibleBitmap( m.hDesktopDc,lnWidth,lnHeight )
ABC=SelectObject( m.hVdc, m.hBitmap )
i=PrintWindow(m.hWnd,m.hVdc,0)
SelectObject( m.hVdc, ABC )
*BitBlt( m.hVdc, 0,0,lnWidth,lnHeight, m.hDesktopDc,0,0, SRCCOPY )

m.hToken = 0
m.iInputBuf = 0h01 + REPLICATE( CHR(0),15 )
m.iResult = -1
IF ( 0 == GdiplusStartup( @ m.hToken, @ m.iInputBuf, 0 ))
m.hGdipBitmap = 0
IF ( 0 == GdipCreateBitmapFromHBITMAP( ;
m.hBitmap, 0, @ m.hGdipBitmap ))
m.cEncoder = ICASE( ;
'jpg' == m.cFileExtName, 0h01, ;
'gif' == m.cFileExtName, 0h02, ;
'tif' == m.cFileExtName, 0h05, ;
'png' == m.cFileExtName, 0h06, 0h00 ) ;
+ 0hF47C55041AD3119A730000F81EF32E
m.iResult = GdipSaveImageToFile( ;
m.hGdipBitmap, ;
STRCONV( m.tcFile+CHR(0), 5 ), ;
m.cEncoder, 0 )
GdipDisposeImage( m.hGdipBitmap )
ENDIF
GdiplusShutdown( m.hToken )
ENDIF

DeleteObject( m.hBitmap )
DeleteDC( m.hVdc )
ReleaseDC( 0, m.hDesktopDc )
...全文
393 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sych11 2020-09-29
  • 打赏
  • 举报
回复
Declare Integer GetDefaultPrinter In winspool.drv String @pszBuffer, Integer @pcchBuffer DECLARE LONG GdipCreateFromHDC IN GDIPLUS LONG hdc, LONG @graphics DECLARE INTEGER FindWindow IN user32 STRING lpClassName,STRING lpWindowName DECLARE INTEGER GetDC IN user32 INTEGER hwnd Declare SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect DECLARE Long GetWindowDC IN WIN32API Long hWnd DECLARE Long ReleaseDC IN WIN32API Long hWnd, Long hDc DECLARE Long CreateCompatibleDC IN WIN32API Long hDc DECLARE Long DeleteDC IN WIN32API Long hDc DECLARE Long CreateCompatibleBitmap IN WIN32API Long hDc, Long nWidth, Long nHeight DECLARE Long BitBlt IN WIN32API Long hDestDC, Long nXDest, Long nYDest, Long nWidth, Long nHeight, Long hSrcDC, Long nXSrc, Long nYSrc, Long dwRop DECLARE Long SelectObject IN WIN32API Long hDc, Long hObject DECLARE Long DeleteObject IN WIN32API Long hObject DECLARE Long GdiplusStartup IN gdiplus Long @ token, String @ inputbuf, Long @ outputbuf DECLARE Long GdiplusShutdown IN gdiplus Long token DECLARE Long GdipCreateBitmapFromHBITMAP IN gdiplus Long hbitmap, Long hpalette, Long @ hGpBitmap DECLARE Long GdipDisposeImage IN gdiplus Long image DECLARE Long GdipSaveImageToFile IN gdiplus Long nImage, String FileName, String clsIdEncoder, Long encoderParams DECLARE LONG CreateDC IN win32api STRING @cDriver, STRING @cDevice, STRING cOutput,STRING cInitData DECLARE INTEGER StartDoc IN win32api INTEGER hdc, STRING @ lpdi DECLARE INTEGER EndDoc IN win32api INTEGER hdc DECLARE INTEGER StartPage IN win32api INTEGER hdc DECLARE INTEGER EndPage IN win32api INTEGER hdc DECLARE LONG GdipDrawImage IN GDIPLUS LONG graphics, LONG nImage, SINGLE x, SINGLE y **以上的API 不是全部用上 只是复制进来,懒得删除了! DECLARE INTEGER PrintWindow IN user32 INTEGER,INTEGER ,INTEGER #define SRCCOPY 0x00CC0020 LOCAL cFileExtName, cEncoder, iInputBuf, iResult LOCAL hDesktopDc, hVDc, hBitmap, hToken, hGdipBitmap m.hWnd=FindWindow("Notepad",NULL) &&截取一个文本窗口试一试 m.hWnd=_vfp.hwnd tcFile=LOWER('d:\aaa.JPG') &&jpg 格式图像 m.cFileExtName =LOWER( JUSTEXT( m.tcFile )) lpRect = REPLI (Chr(0), 16) GetWindowRect (m.hWnd, @lpRect) lnWidth=ctob(SUBS(lpRect,9,4),'4rs')-ctob(SUBS(lpRect,1,4),'4rs')&&窗口宽度 lnHeight=ctob(SUBS(lpRect,13,4),'4rs')-ctob(SUBS(lpRect,5,4),'4rs')&&窗口高度 m.hDesktopDc = GetDC( m.hWnd ) m.hVdc = CreateCompatibleDC( m.hDesktopDc ) m.hBitmap = CreateCompatibleBitmap( m.hDesktopDc,lnWidth,lnHeight ) ABC=SelectObject( m.hVdc, m.hBitmap ) i=PrintWindow(m.hWnd,m.hVdc,0) SelectObject( m.hVdc, ABC ) *BitBlt( m.hVdc, 0,0,lnWidth,lnHeight, m.hDesktopDc,0,0, SRCCOPY ) m.hToken = 0 m.iInputBuf = 0h01 + REPLICATE( CHR(0),15 ) m.iResult = -1 IF ( 0 == GdiplusStartup( @ m.hToken, @ m.iInputBuf, 0 )) m.hGdipBitmap = 0 IF ( 0 == GdipCreateBitmapFromHBITMAP( m.hBitmap, 0, @ m.hGdipBitmap )) IF "5.0"$OS() lcDriver="WINSPOOL" ELSE lcDriver=NULL ENDIF nBufsize = 250 prtname = Replicate(Chr(0), nBufsize) GetDefaultPrinter(@prtname, @nBufsize) prtname = STREXTRACT(prtname, "", Chr(0)) hprnDC = CreateDC(lcDriver, prtname, NULL, null) lcDocInfo = Chr(20) + Repli(Chr(0), 19) StartDoc(hPrnDC, @lcDocInfo) StartPage(hprndc) graphics=0 GdipCreateFromHDC(hprndc, @graphics) GdipDrawImage(graphics,m.hGdipBitmap,0,0) EndPage(hPrnDC) EndDoc(hPrnDC) GdipDisposeImage( m.hGdipBitmap ) ENDIF GdiplusShutdown( m.hToken ) ENDIF DeleteObject( m.hBitmap ) DeleteDC( m.hVdc ) ReleaseDC( 0, m.hDesktopDc ) 这个可以直接打印
kmyz_yyl 2020-09-28
  • 打赏
  • 举报
回复
谢谢! 我原本设想不经过打印窗口实现直接打印,由于技术有限没能实现那种方法,最后也采用了=ShellExecute(0, "print",tcfile,null, "",1)这个函数来实现。
sych11 2020-09-24
  • 打赏
  • 举报
回复
DECLARE INTEGER FindWindow IN user32 STRING lpClassName,STRING lpWindowName DECLARE INTEGER GetDC IN user32 INTEGER hwnd Declare SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect DECLARE Long GetWindowDC IN WIN32API Long hWnd DECLARE Long ReleaseDC IN WIN32API Long hWnd, Long hDc DECLARE Long CreateCompatibleDC IN WIN32API Long hDc DECLARE Long DeleteDC IN WIN32API Long hDc DECLARE Long CreateCompatibleBitmap IN WIN32API Long hDc, Long nWidth, Long nHeight DECLARE Long BitBlt IN WIN32API Long hDestDC, Long nXDest, Long nYDest, Long nWidth, Long nHeight, Long hSrcDC, Long nXSrc, Long nYSrc, Long dwRop DECLARE Long SelectObject IN WIN32API Long hDc, Long hObject DECLARE Long DeleteObject IN WIN32API Long hObject DECLARE Long GdiplusStartup IN gdiplus Long @ token, String @ inputbuf, Long @ outputbuf DECLARE Long GdiplusShutdown IN gdiplus Long token DECLARE Long GdipCreateBitmapFromHBITMAP IN gdiplus Long hbitmap, Long hpalette, Long @ hGpBitmap DECLARE Long GdipDisposeImage IN gdiplus Long image DECLARE Long GdipSaveImageToFile IN gdiplus Long nImage, String FileName, String clsIdEncoder, Long encoderParams Declare INTEGER ShellExecute IN shell32.DLL INTEGER HWND,; STRING lpszOP, ; STRING lpszFile, ; STRING lpszParams, ; STRING lpszDir, ; INTEGER fsshowcmd **以上的API 不是全部用上 只是复制进来,懒得删除了! DECLARE INTEGER PrintWindow IN user32 INTEGER,INTEGER ,INTEGER #define SRCCOPY 0x00CC0020 LOCAL cFileExtName, cEncoder, iInputBuf, iResult LOCAL hDesktopDc, hVDc, hBitmap, hToken, hGdipBitmap m.hWnd=FindWindow("Notepad",NULL) &&截取一个文本窗口试一试 m.hWnd=_vfp.hwnd tcFile=LOWER('d:\aaa.JPG') &&jpg 格式图像 m.cFileExtName =LOWER( JUSTEXT( m.tcFile )) lpRect = REPLI (Chr(0), 16) GetWindowRect (m.hWnd, @lpRect) lnWidth=ctob(SUBS(lpRect,9,4),'4rs')-ctob(SUBS(lpRect,1,4),'4rs')&&窗口宽度 lnHeight=ctob(SUBS(lpRect,13,4),'4rs')-ctob(SUBS(lpRect,5,4),'4rs')&&窗口高度 m.hDesktopDc = GetDC( m.hWnd ) m.hVdc = CreateCompatibleDC( m.hDesktopDc ) m.hBitmap = CreateCompatibleBitmap( m.hDesktopDc,lnWidth,lnHeight ) ABC=SelectObject( m.hVdc, m.hBitmap ) i=PrintWindow(m.hWnd,m.hVdc,0) SelectObject( m.hVdc, ABC ) *BitBlt( m.hVdc, 0,0,lnWidth,lnHeight, m.hDesktopDc,0,0, SRCCOPY ) m.hToken = 0 m.iInputBuf = 0h01 + REPLICATE( CHR(0),15 ) m.iResult = -1 IF ( 0 == GdiplusStartup( @ m.hToken, @ m.iInputBuf, 0 )) m.hGdipBitmap = 0 IF ( 0 == GdipCreateBitmapFromHBITMAP( ; m.hBitmap, 0, @ m.hGdipBitmap )) m.cEncoder = ICASE( ; 'jpg' == m.cFileExtName, 0h01, ; 'gif' == m.cFileExtName, 0h02, ; 'tif' == m.cFileExtName, 0h05, ; 'png' == m.cFileExtName, 0h06, 0h00 ) ; + 0hF47C55041AD3119A730000F81EF32E m.iResult = GdipSaveImageToFile( ; m.hGdipBitmap, ; STRCONV( m.tcFile+CHR(0), 5 ), ; m.cEncoder, 0 ) GdipDisposeImage( m.hGdipBitmap ) ENDIF GdiplusShutdown( m.hToken ) IF m.iResult =0 =ShellExecute(0, "print",tcfile,null, "",1) endif ENDIF DeleteObject( m.hBitmap ) DeleteDC( m.hVdc ) ReleaseDC( 0, m.hDesktopDc ) 这个可以打印
sych11 2020-09-24
  • 打赏
  • 举报
回复
没明白是打印截屏还是打印屏幕上的图片文件,反正最终都是打印文件,所以ShellExecute是最快捷的解决方式
zoumian888 2020-09-18
  • 打赏
  • 举报
回复
如果要实现点击就打印,还要将以上打印按钮的代码用到TIMER事件中,让TIMER事件在后台检测鼠标的范围,如果在打开的"Notepad"范围,并且执行CLICK事件时执行截屏打印操作。
zoumian888 2020-09-18
  • 打赏
  • 举报
回复
你的程序我调试了一下,发现以上代码没有问题,代码是用来生成截屏文件的,不是用来打印截屏的,运行以上代码能正常生成截屏文件'd:\aaa.JPG',如果你要达到点击就打印的功能,显然以上代码还远远不够,最起码要有一个打开"Notepad"文件,然后再设计一个截屏的按钮,将按钮代码写上上面的代码,同时在代码的后面应该再加上将'd:\aaa.JPG'图片文件打印出来的代码。
kmyz_yyl 2020-07-20
  • 打赏
  • 举报
回复
那一句已经改为 m.hWnd=thisform.hWnd,主要原因是代码没有任何反应,也不报错
antony521 2020-07-20
  • 打赏
  • 举报
回复
m.hWnd=FindWindow("Notepad",NULL) &&截取一个文本窗口试一试 这一句窗口名与你要截取的相对应
kmyz_yyl 2020-07-18
  • 打赏
  • 举报
回复
用了一个ShellExecute笨办法先暂时过渡一下,期待各位大师的指点!
内容概要:本文档围绕基于H桥级联五电平逆变器的三相LCL滤波器SPWM调制技术,利用MATLAB/Simulink平台开展系统建模与仿真分析,深入探讨多电平逆变器的调制策略、LCL滤波器的设计方法及其在电力电子系统中的应用。文档不仅聚焦于核心仿真模型的构建与性能验证,还系统整理了大量相关科研资源,涵盖VSG控制、双机并联、下垂控制、无功优化、储能配置、微电网调度等多个前沿方向,展示了MATLAB/Simulink在电力系统、新能源控制、信号处理及智能优化等领域的广泛应用。同时强调科研过程中逻辑思维、创新意识与借助优质仿真资源的重要性,倡导“借力”提升科研效率。; 适合人群:电力电子、电气工程、自动化、新能源系统及相关专业的研究生、科研人员及从事电力电子与微电网仿真的工程技术人员。; 使用场景及目标:①开展多电平逆变器与LCL滤波器的仿真设计及性能优化研究;②深入掌握SPWM调制技术及其在逆变系统中的实现机制;③复现高水平论文中的控制策略与仿真模型,支撑科研项目或论文写作;④结合提供的网盘资源快速获取主流研究方向的Matlab/Simulink代码与模型,加速科研进程。; 其他说明:所有仿真资源可通过关注公众号“荔枝科研社”并访问指定百度网盘链接免费获取,建议读者系统学习文档内容并结合自身研究课题进行实践与创新,充分发挥资源的参考价值与实用价值。
内容概要:本文聚焦于VSG(虚拟同步发电机)双机并联系统中动态虚拟复阻抗在环流抑制与功率均分方面的关键作用,通过Simulink仿真平台系统性地实现了孤岛微电网环境下多逆变器并联运行的核心控制策略。研究深入探讨了动态虚拟复阻抗的设计原理及其对环流的有效抑制机制,确保有功与无功功率的精确均衡分配,同时涵盖了VSG控制、下垂控制、电压电流双闭环调节及系统稳定性分析等核心技术模块。该仿真模型不仅验证了控制算法在静态条件下的有效性,更着重考察其在负载突变等动态工况下的响应速度、鲁棒性与系统整体稳定性,为微电网的可靠自治运行提供了理论依据与实践参考。; 适合人群:具备电力电子、自动控制理论及微电网相关基础知识,从事电气工程、新能源发电系统、分布式能源控制等领域研究的研发人员及高校研究生。; 使用场景及目标:① 深入理解VSG双机并联系统中环流的产生机理及动态虚拟阻抗的抑制方法;② 掌握动态虚拟复阻抗的设计流程及其在实现功率均分中的核心作用;③ 利用Simulink搭建并调试多逆变器协同控制系统,服务于科研项目开发、高水平论文复现或实际工程方案的前期验证。; 阅读建议:建议结合提供的Simulink仿真模型进行动手实践,重点关注控制器参数(如虚拟阻抗值、PI调节器增益)的整定过程与系统动态响应之间的关系,并推荐参考相关领域的权威文献以深化对VSG先进控制策略的理解与优化能力。
内容概要:本文档介绍了一个基于Simulink的发电机故障暂态仿真模型,旨在深入研究发电机在发生短路、接地等典型故障时电压、电流等关键电气量的动态变化过程。通过建立精确的发电机数学模型,并结合实际故障场景进行建模,利用Simulink平台开展高保真度的暂态仿真分析,全面揭示故障期间系统的瞬态响应特性与演化规律。该模型不仅能够准确模拟电磁暂态过程,还可用于电力系统稳定性评估、继电保护装置的设计与校验、故障诊断与定位等关键技术环节,具有重要的科研价值与工程应用前景。此外,文档还整合了大量电力系统相关仿真资源,涵盖微电网、逆变器控制、储能优化、综合能源系统等多个前沿方向,体现了其在电力系统建模仿真领域的广度与深度。; 适合人群:具备电力系统分析基础理论知识和Simulink仿真操作经验的高校研究生、电力领域科研人员及从事电力设备研发与系统运维的工程技术专家。; 使用场景及目标:①应用于高校课程设计与实验教学,帮助学生直观理解发电机故障机理及暂态过程;②服务于科研项目中对新型保护策略、控制算法或系统稳定性的验证与优化;③为实际工程中发电机保护定值整定、故障应急预案制定及系统安全性评估提供可靠的仿真支撑。; 阅读建议:建议读者结合提供的Simulink模型文件与文档说明同步学习,重点掌握发电机建模假设条件、不同故障类型的设置方法以及仿真结果的分析流程,鼓励通过调整系统参数进行对比实验,以深化对电力系统暂态行为本质的理解。

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧