PB11.5调用FindWindowA出错

liuhx999 2009-06-19 08:17:52
ulong ll_handle
int li_loop
run("rar.exe x -e -o+ Update.RAR,Minimized!)
ll_handle = 0
//循环至窗口打开
string ls_null
setnull(ls_null)
Do While ll_handle = 0
ll_handle = FindWindowA(ls_null,"rar.exe")
messagebox('',ll_handle)
yield()
loop
ll_handle怎么总是为0,进入死循环。应该是FindWindowA参数错在哪里了?试过把rar.exe改成“E:\rar.exe”也不行.rar.exe是WINRAR软件带的一个命令行程序。RUN运行正常。
Function ulong FindWindowA (String lpClassName , String lpWindowName ) Library "user32.dll"
Function boolean IsWindow (Long hwnd ) Library "user32.dll"
...全文
399 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhx999 2009-06-19
  • 打赏
  • 举报
回复
搞定了,谢谢各位。
liuhx999 2009-06-19
  • 打赏
  • 举报
回复
用楼上的方法也是一样
永生天地 2009-06-19
  • 打赏
  • 举报
回复
FindWindowA这个函数只能找标题,要真正找到进程才行

加入如下代码:
第一个nvo对象
$PBExportHeader$nvo_findprocess_10x.sru
forward
global type nvo_findprocess_10x from nonvisualobject
end type
end forward

global type nvo_findprocess_10x from nonvisualobject
event ue_findprocess ( )
end type
global nvo_findprocess_10x nvo_findprocess_10x

type prototypes
Function ulong CreateToolhelp32Snapshot (ulong dwFlags, ulong th32ProcessID) Library "KERNEL32.DLL" ALIAS FOR "CreateToolhelp32Snapshot;ansi"
Function boolean Process32First (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" ALIAS FOR "Process32First;ansi"
Function boolean Process32Next (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" ALIAS FOR "Process32Next;ansi"
Function boolean CloseHandle (ref ulong hObject) Library "KERNEL32.DLL" ALIAS FOR "CloseHandle;ansi"

end prototypes

type variables
private:
constant ulong TH32CS_SNAPHEAPLIST = 1 //0x00000001
constant ulong TH32CS_SNAPPROCESS = 2 //0x00000002
constant ulong TH32CS_SNAPTHREAD = 4 //0x00000004
constant ulong TH32CS_SNAPMODULE = 8 //0x00000008
constant ulong TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST + TH32CS_SNAPPROCESS + TH32CS_SNAPTHREAD + TH32CS_SNAPMODULE
constant ulong TH32CS_INHERIT = 2147483648 //0x80000000
constant ulong SMTO_BLOCK = 1
constant ulong SMTO_ABORTIFHUNG = 2
CONSTANT ULONG WM_NULL = 0
CONSTANT ULONG WM_CLOSE = 16
CONSTANT ULONG PROCESS_ALL_Access = 2035711

end variables

forward prototypes
public function long uf_findprocess (string as_exefile)
end prototypes

public function long uf_findprocess (string as_exefile);//功能:查找指定文件名的进程
//参数:as_exefile--指定的文件名
//返回值:指定文件名进程个数
ulong lul_hSnapshot, lul_th32ProcessID,lu_ProcessID
boolean rtn=false
long i=0
PROCESSENTRY32 lpe_processentry
SetNull (lul_th32ProcessID)
lul_hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, lul_th32ProcessID)

if lul_hSnapshot > 0 then

lpe_processentry.dwSize = 296
if Process32First (lul_hSnapshot, lpe_processentry) then
do
if as_exeFile=lpe_processentry.szExeFile then
i=i+1
end if
loop while Process32Next (lul_hSnapshot, lpe_processentry)
end if

CloseHandle (lul_hSnapshot)
end if
return i

end function

on nvo_findprocess_10x.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nvo_findprocess_10x.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

第二个structure

$PBExportHeader$processentry32.srs
global type processentry32 from structure
long dwSize
long cntUsage
long th32ProcessID
long th32DefaultHeapID
long th32ModuleID
long cntThreads
long t32ParentProcessID
long pcPriClassBASE
long dFlags
character szExeFile[500]
end type

第三个,应用

nvo_findprocess lvo_find
lvo_find=create nvo_findprocess

ulong ll_handle
int li_loop
run("rar.exe x -e -o+ Update.RAR,Minimized!)
ll_handle = 0
//循环至窗口打开
string ls_null
setnull(ls_null)
Do While ll_handle = 0
ll_handle = lvo_find.uf_findprocess( 'rar.exe')
messagebox('',ll_handle)
yield()
loop
destroy lvo_find

singsongs 2009-06-19
  • 打赏
  • 举报
回复
FindWindowA的第二个参数貌似应该是你打开的窗口的标题栏上显示的名称。以前我用没有出现过错误啊。
wag_enu 2009-06-19
  • 打赏
  • 举报
回复
查一下MSDN吧.
liuhx999 2009-06-19
  • 打赏
  • 举报
回复
运行计算器是可以的,但运行RAR.exe就不行,难道对命令行窗口就无效了
wag_enu 2009-06-19
  • 打赏
  • 举报
回复
我试过,也是PB115的,没出问题.
你打开一个'计算器'

在运行时这么写:
long ll_handle
ll_handle = FindWindowA(0,'计算器')
liuhx999 2009-06-19
  • 打赏
  • 举报
回复
仍然不行,难道是PB11。5的问题了。
wag_enu 2009-06-19
  • 打赏
  • 举报
回复
改成下面的试一下
FUNCTION ulong FindWindowA (long classname, string windowname) LIBRARY "user32.dll" alias for "FindWindowA;Ansi"

其中windowname,是你要查找的 window 的 title
引用如:
ll_handle = FindWindowA(0,title)
liuhx999 2009-06-19
  • 打赏
  • 举报
回复
楼上的方法试过了,不行
WorldMobile 2009-06-19
  • 打赏
  • 举报
回复

Function boolean IsWindow (Long hwnd ) Library "user32.dll"

改为
Function ulong FindWindowA (String lpClassName , String lpWindowName ) Library "user32.dll" alias for "FindWindowA;Ansi"

即可解决这个问题

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧