| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1040 人关注过本帖, 1 人收藏
标题:请教吹版主关于API函数 openprocess
取消只看楼主 加入收藏
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
结帖率:60%
收藏(1)
已结贴  问题点数:20 回复次数:7 
请教吹版主关于API函数 openprocess

请教吹版主,我在https://www.看到这段VB代码,想借此实现在多个打开的EXCEL文档中找到需要关闭的文档,然后在转成VFP后在下面代码 ??处始终出错,请教是解决办法
Declare Long FindWindowEx IN user32 long hWnd1, long hWnd2, string lpsz1, string lpsz2
DECLARE Long PostMessage IN WIN32API as PostMessageA Long hWnd, Long Msg, Long wParam, Long lParam
Declare INTEGER GetWindowText IN User32 long hWnd, string lpString , long cch
Declare INTEGER GetWindowThreadProcessId in user32 long hwnd, long lpdwProcessId
Declare INTEGER OpenProcess in kernel32 long dwDesiredAccess, long bInheritHandle, long dwProcessId
Declare INTEGER TerminateProcess in kernel32 long hProcess, long uExitCode
*Declare INTEGER RtlAdjustPrivilege in ntdll AND Privilege&, ByVal NewValue&, ByVal NewThread&, OldValue&)
#define WM_CLOSE = &H10
#define PROCESS_TERMINATE = &H1

hWnd = FindWindow("XLMAIN", null)         
procId=0
iid=GetWindowThreadProcessId(hWnd, @procId)
DO While hWnd <> 0
    strText = Space(256)
    GetWindowText(hWnd, @strText, Len(strText))
    strText = Left(strText, at("-",strText ) - 1)   
    If at("Microsoft Excel",strText,1) > 0 Then   
        procId = 0
        iid=GetWindowThreadProcessId(hWnd, procId)

        hProcess = OpenProcess(PROCESS_ALL_ACCESS ,0,iid)    &&  ??

        iRet = TerminateProcess(hProcess, 0)
        iRet = PostMessage(hWnd, WM_CLOSE, 0, 0)
    EndIf
enddo
搜索更多相关主题的帖子: INTEGER 版主 Long API hWnd 
2023-07-04 22:59
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 3楼 吹水佬
感谢回复的两位老师!
能否请吹版主再优化一下代码,给一下过滤出的各个BUF的句柄?

[此贴子已经被作者于2023-7-5 09:55编辑过]

2023-07-05 09:22
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 5楼 吹水佬
谢谢,我用hWnd放到EnumWindows函数下,成功遍历出全部打开的EXCEL文档了。
2023-07-05 22:46
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 9楼 吹水佬
我在您给的代码里加了这句  =EnumWindowsProc(hwnd, NULL)
然后做了一个过程,如下:

PROCEDURE EnumWindowsProc
PARAMETERS hwndv,lParamv
s   =SPACE(128)+CHR(0)
*buf = SPACE(256)+CHR(0)
GetWindowText(hwndv,@s,256)
WAIT WINDOW s
WAIT window "EnumWindowsProc:"+STR(hwndv)   
=getwindowtext(hwndv,s,80)
s=LEFT(s,AT(CHR(0),s)-1)
v=getwindow(hwndv,gw_owner)
a=iswindowvisible(hwndv)
IF LEN(s)>0 AND a<>0 AND v=0
    WAIT WINDOW s
ENDIF
EnumWindowsProc =.t.
ENDPROC
2023-07-07 22:02
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
但是过滤出来的S (EXCEL文档名),用FINDWINDOW 死活得不到这个S 的句柄,请问吹版主这又是怎么回事,如何解决?
如果能用FINDWINDOW得到过滤出的EXCEL文档句柄,那么就可以随心关闭打开的任意EXCEL文档了。

[此贴子已经被作者于2023-7-7 22:22编辑过]

2023-07-07 22:07
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 12楼 吹水佬
得到了句柄,但 PostMessage( m.hWnd, WM_CLOSE, 0, 0)    SendMessage( m.hWnd, WM_CLOSE, 0, 0) 都提示“缺少操作数”,请吹版主和各位高手指点一下,谢谢!

之前的代码我也是用FINDWINDOW得到的句柄,然后用postmessage关闭的EXCEL文档,但今天虽然也获得了句柄却出错误提示

[此贴子已经被作者于2023-7-8 22:09编辑过]

2023-07-08 22:05
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 16楼 吹水佬
我说了,因为代码是测试用,

[此贴子已经被作者于2023-7-9 15:31编辑过]

2023-07-08 23:26
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:61
专家分:28
注 册:2012-11-13
收藏
得分:0 
不知什么原因,突然之间就可以删除了,真是奇怪。


[此贴子已经被作者于2023-7-8 23:35编辑过]

2023-07-08 23:34
快速回复:请教吹版主关于API函数 openprocess
数据加载中...
 
   



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

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