| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3883 人关注过本帖
标题:在vfp点复制,在window 系统里点粘贴,文件拷贝小变通的一点想法(vfp9,win7以 ...
只看楼主 加入收藏
hepingfly
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:195
专家分:657
注 册:2015-5-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
在vfp点复制,在window 系统里点粘贴,文件拷贝小变通的一点想法(vfp9,win7以上版)
对于前面有网友提出的一个问题,也弄个看法:
既:能不能在vfp里面,自做的窗口内,右击一些自做的目录下的文件,出现复制、粘贴、删除的菜单时,点击复制。然后再从window 系统里,打开资源管理器,任选一窗口,所选文件会粘贴到该窗口中? 经思考后,认为稍加变通一下也能做到。(window的复制粘贴涉及内核,难进入)。现将一点作法介绍,仅供试用。
   1.做了2个文件。其中1个是批处理 copywj.bat文件,(4行简单代码),另1个叫做:增添菜单.exe 执行文件。
   2.使用方法:将 bat 文件一定拷进 c:\windows\ 目录内,exe 放任意地方。再就是:要在D盘建一个空文件夹,D:\dkwj\,(此文件夹名称只要与 bat 内一致,允许另改名),准备工作完毕!
   3.开始操作。执行 exe 文件1次,(过多执行没用处,必要时重启电脑,以后不再用了)。实现的效果是:在window 系统桌面,以及任意打开的窗口内,鼠标右击空白的地方时,(不是右击在文件夹或文件上时),会看到显示的window 系统菜单中,新增添了一个项目条 '自制粘贴'。
   4.这时,要求vfp 一方,做点简单事:将vfp窗口内选择的待拷文件,在点击'复制'时,用代码拷进这个D:\dkwj 文件夹内就行了。 注:因为首次使用,D:\dkwj是空的,而且vfp 的一方,还没来得及拷进文件时,也可以首先手工拷几个文件进去,当做vfp 操作时拷进的文件,预先试验一下,等vfp 弄好了自然能用。
   5.window 系统一方:打开资源管理器,鼠标右击桌面或各窗口的空白处,再点击'自制粘贴',看看能不能将这些文件拷进打开的窗口内。
   总结:D:\dkwj 作为中转站的作用。vfp 一方选择的待拷文件,只用简单代码,负责将文件拷进这个 D:\dkwj 目录内即可。window 系统一方,用'自制粘贴',将D:\dkwj内文件,拷进打开的各窗口内。


 
变通式复制.rar (1.05 MB)
搜索更多相关主题的帖子: 资源管理器 windows 执行文件 
2017-01-24 12:54
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1546
专家分:3003
注 册:2012-2-29
收藏
得分:4 
高手,谢谢!
2017-01-24 13:45
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:987
专家分:4946
注 册:2013-2-16
收藏
得分:4 
有点意思,我寻思用VB 做一个DLL ,再用VFP调用,应该也可以。只是一个想法,还没时间来尝试。
2017-01-24 15:26
lljchi
Rank: 2
等 级:论坛游民
帖 子:172
专家分:95
注 册:2016-7-21
收藏
得分:4 
谢谢分享
2017-01-24 15:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏(1)
得分:4 
也可用WinAPI的GetClipboardData()和SetClipboardData(),数据格式为 CF_HDROP(文件对象)。
获取HDROP相对简单点,设置HDROP就相对复杂点。
获取HDROP示例(先在资源管理器“复制”,在运行这代码):
DECLARE LONG IsClipboardFormatAvailable  IN user32 LONG
DECLARE LONG OpenClipboard               IN user32 LONG
DECLARE LONG CloseClipboard              IN user32
DECLARE LONG GetClipboardData            IN user32 LONG
DECLARE LONG DragQueryFile               IN shell32 LONG, LONG, STRING@, LONG
#DEFINE CF_HDROP  15
IF IsClipboardFormatAvailable(CF_HDROP) == 0
    RETURN
ENDIF
IF OpenClipboard(0) == 0
    RETURN
ENDIF
hDrop = GetClipboardData(CF_HDROP)
IF hDrop == 0
    CloseClipboard()
    RETURN
ENDIF
nFiles = DragQueryFile(hDrop, -1, NULL, 0)
FOR i=0 TO nFiles-1
    nBufSize = DragQueryFile(hDrop, i, NULL, 0) + 1
    sBuf = SPACE(nBufSize)
    DragQueryFile(hDrop, i, @sBuf, nBufSize)
    ? sBuf
ENDFOR
CloseClipboard()
CLEAR DLLS
RETURN



[此贴子已经被作者于2017-1-24 23:32编辑过]

2017-01-24 16:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏
得分:0 
**
** 示例1
** 先在资源管理器选择“复制”,然后运行本代码。
**
DECLARE LONG IsClipboardFormatAvailable IN user32 LONG
DECLARE LONG OpenClipboard IN user32 LONG
DECLARE LONG CloseClipboard IN user32
DECLARE LONG GetClipboardData IN user32 LONG
DECLARE LONG DragQueryFile IN shell32 LONG, LONG, STRING@, LONG

#DEFINE CF_HDROP  15

DIMENSION aFiles[1]
IF _GetClipFiles(@aFiles)
    FOR i=1 TO ALEN(aFiles)
        ?aFiles[i]
    ENDFOR
ENDIF
CLEAR DLLS
RETURN

FUNCTION _GetClipFiles(aFiles)
    IF IsClipboardFormatAvailable(CF_HDROP) == 0
        RETURN .F.
    ENDIF
    IF OpenClipboard(0) == 0
        RETURN .F.
    ENDIF
    LOCAL hDrop
    hDrop = GetClipboardData(CF_HDROP)
    IF hDrop == 0
        CloseClipboard()
        RETURN .F.
    ENDIF
    LOCAL i, nFiles, sBuf, nBufSize
    nFiles = DragQueryFile(hDrop, -1, NULL, 0)
    DIMENSION aFiles[nFiles]
    FOR i=0 TO nFiles-1
        nBufSize = DragQueryFile(hDrop, i, NULL, 0) + 1
        sBuf = SPACE(nBufSize)
        DragQueryFile(hDrop, i, @sBuf, nBufSize)
        aFiles[i+1] = RTRIM(sBuf, 0h00)
    ENDFOR
    CloseClipboard()
    RETURN .T.
ENDFUNC
2017-01-24 23:45
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏
得分:0 
**
** 示例2
** 假设要复制 C:\TEMP\test1.txt和C:\TEMP\test2.txt文件
** 先运行本代码,然后在资源管理器选择“粘贴”
**
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 GlobalAlloc IN kernel32 LONG, LONG
DECLARE LONG GlobalLock IN kernel32 LONG
DECLARE LONG GlobalUnlock IN kernel32 LONG

#DEFINE CF_HDROP  15
#DEFINE GHND  0x0042
sFiles = "C:\TEMP\test1.txt" + 0h00 + "C:\TEMP\test2.txt" + 0h0000
_SetClipFiles(sFiles)
CLEAR DLLS
RETURN

FUNCTION _SetClipFiles(sFiles)
    IF OpenClipboard(0) == 0
        RETURN .F.
    ENDIF
    LOCAL hDrop, pDrop, stDROPFILES
    EmptyClipboard()
    stDROPFILES = BINTOC(20, "4RS") + REPLICATE(0h00, 16) + sFiles
    hDrop = GlobalAlloc(GHND, LEN(stDROPFILES))
    pDrop = GlobalLock(hDrop)
    SYS(2600, pDrop, LEN(stDROPFILES), stDROPFILES)
    GlobalUnlock(hDrop)
    SetClipboardData(CF_HDROP, hDrop)
    CloseClipboard()
    RETURN .T.
ENDFUNC
2017-01-24 23:46
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3146
专家分:8408
注 册:2015-3-25
收藏
得分:4 
以下是引用吹水佬在2017-1-24 23:46:43的发言:

**
** 示例2
** 假设要复制 C:\TEMP\test1.txt和C:\TEMP\test2.txt文件
** 先运行本代码,然后在资源管理器选择“粘贴”
**
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 GlobalAlloc IN kernel32 LONG, LONG
DECLARE LONG GlobalLock IN kernel32 LONG
DECLARE LONG GlobalUnlock IN kernel32 LONG
 
#DEFINE CF_HDROP  15
#DEFINE GHND  0x0042
sFiles = "C:\TEMP\test1.txt" + 0h00 + "C:\TEMP\test2.txt" + 0h0000
_SetClipFiles(sFiles)
CLEAR DLLS
RETURN
 
FUNCTION _SetClipFiles(sFiles)
    IF OpenClipboard(0) == 0
        RETURN .F.
    ENDIF
    LOCAL hDrop, pDrop, stDROPFILES
    EmptyClipboard()
    stDROPFILES = BINTOC(20, "4RS") + REPLICATE(0h00, 16) + sFiles
    hDrop = GlobalAlloc(GHND, LEN(stDROPFILES))
    pDrop = GlobalLock(hDrop)
    SYS(2600, pDrop, LEN(stDROPFILES), stDROPFILES)
    GlobalUnlock(hDrop)
    SetClipboardData(CF_HDROP, hDrop)
    CloseClipboard()
    RETURN .T.
ENDFUNC
吹版还真厉害!有几个地方不明白,0x0042,0h00,4RS分别代表什么
2017-01-25 14:56
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用mywisdom88在2017-1-25 14:56:42的发言:

吹版还真厉害!有几个地方不明白,0x0042,0h00,4RS分别代表什么

#DEFINE GHND 0x0042 定义的是调用GlobalAlloc()选择内存分配方式。
具体可参考MSDN:https://msdn.(v=vs.85).aspx

0h00相当于CHR(0x00)

4RS:
4指用32位(4字节)。

R与内存高低存储方式有关,如0x01020304,在内存从高位到低位为0h04030201,
用?STRCONV(BINTOC(0x01020304,"4RS"),15)可以看到结果04030201。

S是保护符号位不受影响,最高位为符号位,符号位为1时表示负数,如:
?STRCONV(BINTOC(-1,"1RS"),15)....显示FF,即BIN:11111111
?STRCONV(BINTOC(-1,"1R"),15).....显示7F,即BIN:01111111 最高位没了。
?STRCONV(BINTOC(-128,"1RS"),15)..显示80,即BIN:10000000
?STRCONV(BINTOC(-128,"1R"),15)...显示00,即BIN:00000000
2017-01-25 16:42
lljchi
Rank: 2
等 级:论坛游民
帖 子:172
专家分:95
注 册:2016-7-21
收藏
得分:0 
回复 9楼 吹水佬
2017-01-25 16:53
快速回复:在vfp点复制,在window 系统里点粘贴,文件拷贝小变通的一点想法(vfp9, ...
数据加载中...
 
   



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

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