| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 849 人关注过本帖
标题:VFP循环调用截屏程序和另存为程序,会出现图片漏拷贝,尝试加大间隔等待时间 ...
只看楼主 加入收藏
shschy
Rank: 2
等 级:论坛游民
帖 子:87
专家分:20
注 册:2022-3-13
结帖率:33.33%
收藏
 问题点数:0 回复次数:10 
VFP循环调用截屏程序和另存为程序,会出现图片漏拷贝,尝试加大间隔等待时间,无效
需要:要将某个listbox中列出的JPG文件部分提取,(提取老工卡的照片区域)
方法:遍历listbox数据,依次显示对应JPG,再循环调用 command截屏至粘贴板.click
                                                   command另存为.click
问题:读取文件夹(Adir()结果到listbox)里图片少时,都能截取保存到新文件,
      文件夹里文件多时,50张以上,常会发生无法保存下来。
      因为目录下多文件依次操作,找不到原因。现在只能人工查。
          人工遍历检查时发现少文件,点按钮调用上面的截屏至粘贴板.click和另存为.click
需求:1)产生原因不知道,希望解决。2)有直接剪贴到粘贴板并同时存储的合并程序吗,因为上面两段代码合并困难。
      谢谢!


下面为部分截屏至粘贴板,保存为command截屏至粘贴板.click
DECLARE long GetDC            IN user32 long
DECLARE long ReleaseDC        IN user32 long,long
DECLARE long OpenClipboard    IN user32 long
DECLARE long EmptyClipboard   IN user32
DECLARE long CloseClipboard   IN user32
DECLARE long SetClipboardData IN user32 long,long

DECLARE long CreateCompatibleDC     IN gdi32 long
DECLARE long DeleteDC               IN gdi32 long
DECLARE long CreateCompatibleBitmap IN gdi32 long,long,long
DECLARE long SelectObject           IN gdi32 long,long
DECLARE long DeleteObject           IN gdi32 long
DECLARE long BitBlt                 IN gdi32 long,long,long,long,long,long,long,long,long

LOCAL nX, nY, nWidth, nHeight, hDC, pDC, hBitmap
        nX      = thisform.shape1.left+1  &&0
        nY      = thisform.shape1.top+1 &&0
        nWidth  = thisform.shape1.width-1
        nHeight = thisform.shape1.height-1

        hDC     = GetDC(thisform.hWnd)
        pDC     = CreateCompatibleDC(hDC)
        hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight)
        SelectObject(pDC, hBitmap)
        BitBlt(pDC, 0, 0, nWidth, nHeight, hDC, nX, nY, 0xCC0020)  && SRCCOPY
        
        IF OpenClipboard(0) == 0
            MESSAGEBOX("打开剪贴板失败")
            RETURN
        ENDIF
        EmptyClipboard()
        SetClipboardData(2, hBitmap) &&CF_BITMAP
        CloseClipboard()
        WAIT windows "当前第"+STR(ii_pub)+"个"+CHR(13)+"图像装入剪贴板" nowait
        PUBLIC outfile_loc_pub
        outfile_loc_pub=ALLTRIM(thisform.text_ZHML.Value)+ALLTRIM(thisform.list2.Value)
        outfile_loc_pub=STRTRAN(outfile_loc_pub,"拷贝","截取")
        &&DeleteObject(hBitmap)
        DeleteDC(pDC)
        ReleaseDC(thisform.hWnd, hDC)

下面为部分将粘贴板内容另存为指定jpg,保存为command另存为.click
DECLARE INTEGER GetClipboardData IN win32api INTEGER
DECLARE INTEGER OpenClipboard IN win32api INTEGER
DECLARE INTEGER CloseClipboard IN win32api
DECLARE LONG IsClipboardFormatAvailable IN user32 LONG
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
Declare Long GdiplusShutdown in GdiPlus  Long token
Declare Long GdiplusStartup in GdiPlus  Long @ token, String @ input, Long @ output
DECLARE INTEGER GdipCreateBitmapFromHBITMAP in GdiPlus.dll INTEGER, INTEGER, INTEGER @
DECLARE INTEGER GdipSaveImageToFile in GdiPlus.dll INTEGER,String,String @,String @
DECLARE LONG GdipDisposeImage IN GDIPLUS LONG nImage
*查剪贴板
IF IsClipboardFormatAvailable(2)=0
   WAIT windows "剪贴板中没有图像" nowait
else
    IF OpenClipboard(0)=0
       WAIT windows "当前第"+STR(ii_pub)+"个"+CHR(13)+"剪贴板打开失败" nowait
    else
        PUBLIC outfile_loc_pub
        WAIT windows "当前第"+STR(ii_pub)+"个"+CHR(13)+outfile_loc_pub nowait
        lcOutputFile="&outfile_loc_pub"
        hBitmap = GetClipboardData(2)  &&CF_BITMAP=2
        hToken=0
        cInput = PADR(CHR(1), 16, CHR(0))
        GdiplusStartup(@hToken, @cInput, 0)
        ubitmap=0
        GdipCreateBitmapFromHBITMAP(hBitmap,2,@ubitmap)
        qEncoderClsID_PNG=0h01F47C55041AD3119A730000F81EF32E
        GdipSaveImageToFile(ubitmap,STRCONV(lcOutputFile+CHR(0),5),qEncoderClsID_PNG,null)
        GdipDisposeImage(ubitmap)
        GdiplusShutdown(m.hToken)
        closehandle(hBitmap)
        CloseClipboard()
        WAIT windows "当前第"+STR(ii_pub,8)+"个"+CHR(13)+"截屏保存到"+CHR(13)+"&lcOutputFile" nowait
        &&CREATE TABLE jqtpjc_loc (序号 C(08),源图名 c(80),操作 c(4),截图片 c(80),结果 c(4))
        SELECT jqtpjc_loc
        UPDATE jqtpjc_loc SET 截图片="&lcOutputFile",结果="保存" WHERE 序号=STR(ii_pub,8)
        IF !FILE("&lcOutputFile")
           MESSAGEBOX("&lcOutputFile"+CHR(13)+"没生成")
        ELSE            
        endif   
    endif
ENDIF
RETURN .t.
&&差别在第4个字符
搜索更多相关主题的帖子: INTEGER click long 另存为 thisform 
2023-08-02 17:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
无需通过剪贴板,截屏后直接写入文件就可以了吧
2023-08-02 17:33
shschy
Rank: 2
等 级:论坛游民
帖 子:87
专家分:20
注 册:2022-3-13
收藏
得分:0 
以下是引用吹水佬在2023-8-2 17:33:21的发言:

无需通过剪贴板,截屏后直接写入文件就可以了吧

请帮助给个代码(VFP中指定区域截屏再另存为指定文件)吧!谢谢!我记得以前也试过代码忘记了,因为临时性需求,没深究。现在看来,这个功能会常要用的。
再次感谢版主历次分享经验。
2023-08-02 17:38
shschy
Rank: 2
等 级:论坛游民
帖 子:87
专家分:20
注 册:2022-3-13
收藏
得分:0 
再请教此问题相关问题,单独截屏保存操作分别执行(command截屏至粘贴板.click和command另存为.click)后,文件夹里有时看不到,有时过一会文件夹浏览器里按F5后,发现多了一个文件。这个生成机制是立马生成的吧!
曾经VFP调用BAT批处理文件,也发生或漏个别BAT文件执行结果没有保存下来。
2023-08-02 17:48
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:334
专家分:810
注 册:2021-1-9
收藏
得分:0 
要不试试木瓜的myFll
2023-08-02 19:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏(1)
得分:0 
回复 3楼 shschy
示例
程序代码:
**
** 屏幕截图
**
DECLARE long GetDC     IN user32 long
DECLARE long ReleaseDC IN user32 long,long

DECLARE long CreateCompatibleDC     IN gdi32 long
DECLARE long DeleteDC               IN gdi32 long
DECLARE long CreateCompatibleBitmap IN gdi32 long,long,long
DECLARE long SelectObject           IN gdi32 long,long
DECLARE long DeleteObject           IN gdi32 long
DECLARE long BitBlt                 IN gdi32 long,long,long,long,long,long,long,long,long

DECLARE long GdiplusStartup              IN gdiplus long@,string@,long
DECLARE long GdiplusShutdown             IN gdiplus long
DECLARE long GdipCreateBitmapFromHBITMAP IN gdiplus long,long,long@
DECLARE long GdipDisposeImage            IN gdiplus long
DECLARE long GdipSaveImageToFile         IN gdiplus long,string,string,long

* 初始化GDI
stGSI = 0h01000000000000000000000000000000
lpGDI = 0
GdiplusStartup(@lpGDI, @stGSI, 0)
**IF screenshot(_vfp.hWnd, "d:\temp\tmp.bmp", 100, 100, 1000, 600)
IF screenshot(0, "d:\temp\tmp.png", 0, 0, 1000, 600)
    MESSAGEBOX("截图完成")
ENDIF 
GdiplusShutdown(lpGDI)
CLEAR DLLS
RETURN

FUNCTION screenshot(hWnd, outFile, X, Y, nWidth, nHeight)
    IF !DIRECTORY(JUSTPATH(outFile))
        MESSAGEBOX("无效的输出文件路径")
        RETURN .F.
    ENDIF
    * 图像GUID
    LOCAL cExt, GUID
    cExt = LOWER(JUSTEXT(outFile))
    GUID = ICASE(cExt == "bmp", 0h00,;
                 cExt == "jpg", 0h01,;
                 cExt == "gif", 0h02,;
                 cExt == "tif", 0h05,;
                 cExt == "png", 0h06, "")
    IF ("" == GUID)
        MESSAGEBOX("无效的输出文件名")
        RETURN .F.
    ENDIF
    GUID = GUID + 0hF47C55041AD3119A730000F81EF32E
        * 获取图像设备句柄
    LOCAL hDC  
    hDC = GetDC(hWnd)
    IF (hDC == 0)
        MESSAGEBOX("获取图像设备句柄失败")
        RETURN .F.
    ENDIF
        * 获取截图设备句柄
    LOCAL hppDC, hBitmap, pBitmap
    hppDC   = CreateCompatibleDC(hDC)
    hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight)
        * 获取截图
    SelectObject(hppDC, hBitmap) 
    BitBlt(hppDC, 0, 0, nWidth, nHeight, hDC, X, Y, 0xCC0020)  && SRCCOPY
        * 保存截图
    outFile = STRCONV(outFile + 0h00, 5)
    pBitmap = 0
    GdipCreateBitmapFromHBITMAP(hBitmap, 2, @pBitmap)
    GdipSaveImageToFile(pBitmap, outFile, GUID, 0)
        * 释放资源
    GdipDisposeImage(pBitmap)
    DeleteObject(hBitmap)
    DeleteDC(hppDC)
    ReleaseDC(hWnd, hDC)
    RETURN .T.
ENDFUNC
2023-08-02 20:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 4楼 shschy
可能是浏览文件的界面未刷新
可以用VFP的FILE()检测
2023-08-02 20:53
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 6楼 吹水佬
谢谢!
2023-08-03 06:29
z12689
Rank: 2
等 级:论坛游民
帖 子:50
专家分:83
注 册:2021-4-15
收藏
得分:0 
以下是引用吹水佬在2023-8-2 20:53:40的发言:

可能是浏览文件的界面未刷新
可以用VFP的FILE()检测

吹版辛苦
2023-08-03 10:21
shschy
Rank: 2
等 级:论坛游民
帖 子:87
专家分:20
注 册:2022-3-13
收藏
得分:0 
回复 6楼 吹水佬
请问其中 CLEAR DLLS 代码完成什么功能?谢谢!
2023-08-03 15:33
快速回复:VFP循环调用截屏程序和另存为程序,会出现图片漏拷贝,尝试加大间隔等 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020039 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved