| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1170 人关注过本帖, 1 人收藏
标题:请教吹版主关于API函数 openprocess
只看楼主 加入收藏
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:62
专家分:28
注 册:2012-11-13
结帖率:60%
收藏(1)
已结贴  问题点数:20 回复次数:18 
请教吹版主关于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
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:707
专家分:2833
注 册:2018-3-13
收藏
得分:8 
唉,这段代码问题实在多不胜数

以下是引用kmyz_yyl在2023-7-4 22:59:40的发言:
#define WM_CLOSE = &H10
#define PROCESS_TERMINATE = &H1
vfp 有 &h 这种表示16进制法吗?

以下是引用kmyz_yyl在2023-7-4 22:59:40的发言:
hWnd = FindWindow("XLMAIN", null)         
procId=0
iid=GetWindowThreadProcessId(hWnd, @procId)
FindWindow 在哪声明的?后面两句有意义吗?hWnd 为零时咋整?

以下是引用kmyz_yyl在2023-7-4 22:59:40的发言:
DO While hWnd <> 0
 ...
enddo
hWnd 不为零的话,岂不是要死循环?

以下是引用kmyz_yyl在2023-7-4 22:59:40的发言:
        procId = 0
        iid=GetWindowThreadProcessId(hWnd, procId)
        hProcess = OpenProcess(PROCESS_ALL_ACCESS ,0,iid)    &&  ??
OpenProcess 要传入的是进程 id, 为何要传入线程id ?

以下是引用kmyz_yyl在2023-7-4 22:59:40的发言:
        iRet = TerminateProcess(hProcess, 0)
        iRet = PostMessage(hWnd, WM_CLOSE, 0, 0)
进程都杀死了,还有窗口值得关闭?

这家伙很懒,啥也没留下
2023-07-05 05:49
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:12 
回复 楼主 kmyz_yyl
看似是想枚举窗口,但又与进程相关?
枚举窗口判断从窗口类入手,不同版本的Excel主窗口类名兼容性有无问题?
参考示例:
程序代码:
DECLARE long GetWindow       IN user32 long,long
DECLARE long GetWindowText   IN user32 long,string@,long
DECLARE long GetClassName    IN user32 long,string@,long
DECLARE long IsWindowVisible IN user32 long
DECLARE long SendMessage     IN user32 long,long,long,long

#define GW_HWNDFIRST   0
#define GW_HWNDNEXT    2
#define WM_CLOSE       0x10

xls = "Book1.xls"
buf = SPACE(256)
hWnd = GetWindow(_vfp.hWnd, GW_HWNDFIRST)
DO WHILE hWnd != 0
    IF IsWindowVisible(hWnd) == 1
        len = GetClassName(hWnd, @buf, 256)
        IF LEFT(buf,len)=="XLMAIN"
            len = GetWindowText(hWnd, @buf, 256)
            IF AT(xls,LEFT(buf,len)) != 0
                SendMessage(hWnd, WM_CLOSE, 0, 0)
            ENDIF 
         ENDIF
    ENDIF
    hWnd = GetWindow(hWnd, GW_HWNDNEXT)
ENDDO

2023-07-05 07:01
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:62
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 3楼 吹水佬
感谢回复的两位老师!
能否请吹版主再优化一下代码,给一下过滤出的各个BUF的句柄?

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

2023-07-05 09:22
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 4楼 kmyz_yyl
结果就是所有 SendMessage(hWnd, WM_CLOSE, 0, 0) 的 hWnd
2023-07-05 10:19
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:62
专家分:28
注 册:2012-11-13
收藏
得分:0 
回复 5楼 吹水佬
谢谢,我用hWnd放到EnumWindows函数下,成功遍历出全部打开的EXCEL文档了。
2023-07-05 22:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用kmyz_yyl在2023-7-5 22:46:38的发言:

谢谢,我用hWnd放到EnumWindows函数下,成功遍历出全部打开的EXCEL文档了。

请问,VFP是怎样调用用EnumWindows函数?
2023-07-05 23:38
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:113
专家分:324
注 册:2021-10-23
收藏
得分:0 
vfp2c32.fll库中有丰富的函数,回调,多线程等.
https://
Enum.rar (110.81 KB)
2023-07-06 01:10
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用kmyz_yyl在2023-7-5 09:22:23的发言:

能否请吹版主再优化一下代码,给一下过滤出的各个BUF的句柄?

不只是要枚举EXCEL的窗口,还要考虑有无能打开xls的其他应用程序,这个问题就复杂点。
还有就是枚举过程完成后还有无可能会被打开。
2023-07-06 06:38
kmyz_yyl
Rank: 2
等 级:论坛游民
帖 子:62
专家分: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
快速回复:请教吹版主关于API函数 openprocess
数据加载中...
 
   



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

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