注册 登录
编程论坛 VFP论坛

咨询如何判断WORD或EXCEL中某个文档是否已被打开

shschy 发布于 2024-05-26 23:47, 547 次点击
VFP在生成、修改DOCX或XLSX文档时,会有提示,文档已被打开。
请问如何在打开某文档前,实现先判断同名文件(比如ABCD0001.docx或ABCD0001.xlsx)是否已被打开。
谢谢!
11 回复
#2
shizi02024-05-27 00:49
hFile=FOPEN([ABCD0001.docx],12)
if hFile>0
    未被打开
    =FCLOSE(hFile)   
else
    已被打开
endif

#3
easyppt2024-05-27 11:01
这个代码好像不行,比如:打开前判断一下,然后关闭,再判断,前后结果一样
#4
shschy2024-05-27 11:19
希望在VFP建立DOCX前,先检查对应的DOCX都没被打开,使用fopen()有时不准确?
&&新建d:\VFP_OPEN.docx后,使用WPS打开,再关闭
?FOPEN("d:\VFP_OPEN.docx",12)    ,返回-1,从WPS打开后,及时WPS关闭5分钟后,执行FOPEN("d:\VFP_OPEN.docx",12)都是返回-1
?FOPEN("d:\VFP_OPEN_new.docx",12),返回35,新建但WPS不打开,就一直会返回35
以下是引用shizi0在2024-5-27 00:49:24的发言:

hFile=FOPEN([ABCD0001.docx],12)
if hFile>0
    未被打开
    =FCLOSE(hFile)   
else
    已被打开
endif

#5
sych2024-05-27 12:14
查找窗口如何?如果文件被打开,标题栏应该有该文件的相应信息
PROCEDURE xlspd
Lpara ctitle,fname
Declare INTEGER GetDesktopWindow IN user32
Declare INTEGER GetWindow IN user32 INTEGER hwnd, INTEGER wFlag
Declare INTEGER GetWindowText IN user32;
    INTEGER hwnd, STRING @lpString, INTEGER cch
Declare INTEGER GetModuleFileNameEx IN psapi;
    INTEGER hProcess,;
    INTEGER hModule,;
    STRING ModuleName,;
    INTEGER nSize
Declare INTEGER GetWindowThreadProcessId IN user32;
    INTEGER   hWnd,;
    INTEGER @ lpdwProcId
Declare INTEGER OpenProcess IN kernel32;
    INTEGER dwDesiredAccessas,;
    INTEGER bInheritHandle,;
    INTEGER dwProcId
Declare INTEGER CloseHandle IN kernel32 INTEGER hObject
Declare integer GetClassName in user32;
    integer hwnd, ;
    string lpClassName, ;
    integer nMaxCount
ctitle=lower(ctitle)
Local hDesktop, hFirstChild, hLastChild, cBuffer, nResult,hwnd,hCurrent,ii,jj,lwin(1)
hCurrent = hDesktop
ii=0
jj=1
lwin(1)=GetDesktopWindow()
hwnd=0
DO whil ii<jj
    ii=II+1
    hCurrent=lwin(ii)
    hFirstChild = GetWindow(hCurrent, 5)
    hLastChild = GetWindow(hFirstChild, 1)
    hCurrent = hFirstChild
    Do WHILE  hCurrent>0
        cBuffer = Space(250)
        nResult = GetWindowText(hCurrent, @cBuffer, Len(cBuffer))
        cBuffer= SUBSTR(cBuffer, 1, nResult)
        If at(ctitle,lower(cBuffer))>0
            HWnd=hCurrent
            ii=jj
            Exit
        ENDIF
        jj=jj+1
        LOCAL lwin(jj)
        lwin(jj)=hCurrent
        If hCurrent = hLastChild
            Exit
        Endif
        hCurrent = GetWindow(hCurrent, 2)
    ENDDO
ENDDO
Retu hwnd

[此贴子已经被作者于2024-5-27 12:24编辑过]

#6
sdta2024-05-27 12:22
全路径+文件名
#7
shschy2024-05-27 15:12
是按照?xlspd("d:\","VFP_OPEN.docx")来调用吗
(1)是按照?xlspd("d:\","VFP_OPEN.docx")来调用吗?但调用后无任何反馈?
(2)如果返回一个句柄,那么fclose(句柄)可以关闭WPS里打开的docx文档吗?
谢谢!
以下是引用sych在2024-5-27 12:14:34的发言:查找窗口如何?如果文件被打开,标题栏应该有该文件的相应信息PROCEDURE xlspdLpara ctitle,fnameDeclare INTEGER GetDesktopWindow IN user32Declare INTEGER GetWindow IN user32 INTEGER hwnd, INTEGER wFlagDeclare INTEGER GetWindowText IN user32;    INTEGER hwnd, STRING @lpString, INTEGER cchDeclare INTEGER GetModuleFileNameEx IN psapi;    INTEGER hProcess,;    INTEGER hModule,;    STRING ModuleName,;    INTEGER nSizeDeclare INTEGER GetWindowThreadProcessId IN user32;    INTEGER   hWnd,;    INTEGER @ lpdwProcIdDeclare INTEGER OpenProcess IN kernel32;    INTEGER dwDesiredAccessas,;    INTEGER bInheritHandle,;    INTEGER dwProcIdDeclare INTEGER CloseHandle IN kernel32 INTEGER hObjectDeclare integer GetClassName in user32;    integer hwnd, ;    string lpClassName, ;    integer nMaxCountctitle=lower(ctitle)Local hDesktop, hFirstChild, hLastChild, cBuffer, nResult,hwnd,hCurrent,ii,jj,lwin(1)hCurrent = hDesktopii=0jj=1lwin(1)=GetDesktopWindow()hwnd=0DO whil ii<jj    ii=II+1    hCurrent=lwin(ii)    hFirstChild = GetWindow(hCurrent, 5)    hLastChild = GetWindow(hFirstChild, 1)    hCurrent = hFirstChild    Do WHILE  hCurrent>0        cBuffer = Space(250)        nResult = GetWindowText(hCurrent, @cBuffer, Len(cBuffer))        cBuffer= SUBSTR(cBuffer, 1, nResult)        If at(ctitle,lower(cBuffer))>0            HWnd=hCurrent            ii=jj            Exit        ENDIF        jj=jj+1        LOCAL lwin(jj)        lwin(jj)=hCurrent        If hCurrent = hLastChild            Exit        Endif        hCurrent = GetWindow(hCurrent, 2)    ENDDOENDDORetu hwnd
#8
sych2024-05-27 16:22
回复 7楼 shschy
?xlspd("VFP_OPEN")
#9
shschy2024-05-27 16:42
xlspd("VFP_OPEN")会判断文件的扩展名吗
测试后可用,但对于“项目XXXX.docx”或“项目XXXX.xlsx”,只要有1个打开,打开都返回“》0”的数值
1)由于编辑时,项目文档名分别存为“项目XXXX.docx”和“项目XXXX.xlsx”,可以区分开吗?
2)还是希望能实现“完整目录”+“文件名”,因为无论是xlsx还是docx如果存在不同目录下,都是可以被同时打开的。
谢谢!
以下是引用sych在2024-5-27 16:22:27的发言:

?xlspd("VFP_OPEN")

#10
sych2024-05-27 17:11
窗口句柄已经找出来了,你自己想怎么做可以随意发挥,根据窗口句柄找类名、可执行程序名等等,再加以精准区分
#11
asis2024-05-27 17:39
lpszFile="导出文件.xlsx"
if file(lpszFile)
llerror=.f.
on error llerror=.t.
Delete File (lpszFile)
if llerror=.t.
MESSAGEBOX('错误:Excel文件:'+lpszFile+' 正在打开着(无法导出)!'+chr(13)+chr(13)+'【解决办法】:请在下方的任务栏单击此文件并将其关闭后,再次按此按钮导出,谢谢合作!',48,'提示')
retu
endif
ENDIF
#12
shschy2024-05-27 22:17
回复 10楼 sych
您好!能再发些VFP调用文件句柄的学习资料(获得窗口名称代码),谢谢!
1