如何得到运行程序返回的句柄值

deansroom 2009-03-17 11:22:16
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
H : THandle;
PI : TProcessInformation;

implementation

{$R *.dfm}
type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID : DWORD;
HWND : THandle;
end;
function EnumwindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID : DWORD;
begin
GetWindowThreadProcessID(Wnd, @PID);
Result := (PID <> EI.ProcessID) or(not IsWindowVisible(WND)) or(not IsWindowEnabled(WND));
if not result then EI.HWND := WND;
end;

function FindMainWindow(PID: DWORD): DWORD;
var
EI : TEnumInfo;
begin
EI.ProcessID := PID;
EI.HWND := 0;
Enumwindows(@EnumwindowsProc, Integer(@EI));
Result := EI.HWND;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
SI : TStartupInfo;


S : String;
begin
ZeroMemory(@SI, SizeOf(SI));
ZeroMemory(@PI, SizeOf(PI));
SI.cb := SizeOf(SI);
if CreateProcess(nil,'D:\Program Files\StormII\Storm.exe', nil, nil, False, 0 ,nil,nil, SI, PI) then
begin
//注意!
WaitForInputIdle(PI.hProcess, INFINITE);
//INFINITE
H := FindMainWindow(PI.dwProcessID);
if H>0 then
end;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
//PostThreadMessage(pi.dwThreadId, WM_QUIT, 0,0);
//SendMessage(H, WM_LBUTTONUP, MK_LBUTTON, makelparam(50,50));
SendMessage(H,WM_LBUTTONdown, MK_LBUTTON, makelparam(50,50));
//PostThreadMessage(pi.dwThreadId, WM_QUIT, 0,0);
end;

end.
现在是如何得到H返回的句柄值,如果在H := FindMainWindow(PI.dwProcessID);
设断点可以得到H返回的句柄值,但是不设置断点就得不到,希望能给我解决这个问题,谢谢,分不够,开贴再送
...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
超龄编码人 2009-04-22
  • 打赏
  • 举报
回复
这是什么意思呢?
nanchangfantasy 2009-04-22
  • 打赏
  • 举报
回复
说错了,我只熟悉FindWindow,说的也是FindWindow
nanchangfantasy 2009-04-22
  • 打赏
  • 举报
回复
FindMainWindow现在在win32里用的都比较少,不太可靠,而且要查找所有的窗体,速度慢
yinxl2008 2009-03-23
  • 打赏
  • 举报
回复
用FindWindow(nil,'暴风影音');这个可以得到它的句柄吧
deansroom 2009-03-21
  • 打赏
  • 举报
回复
呵呵,现在就是想得到暴风窗体界面的返回值!~
  • 打赏
  • 举报
回复
'D:\Program Files\StormII\Storm.exe'

必须是个有窗体界面的程序。
deansroom 2009-03-18
  • 打赏
  • 举报
回复
没人能给个提示吗?
starluck 2009-03-17
  • 打赏
  • 举报
回复


procedure TForm1.Button1Click(Sender: TObject);
var
SI : TStartupInfo;


S : String;
begin
ZeroMemory(@SI, SizeOf(SI));
ZeroMemory(@PI, SizeOf(PI));
SI.cb := SizeOf(SI);
if CreateProcess(nil,'D:\Program Files\StormII\Storm.exe', nil, nil, False, 0 ,nil,nil, SI, PI) then
begin
//注意!
WaitForInputIdle(PI.hProcess, INFINITE);

if WaitForSingleObject(PI.hProcess, INFINITE) = WAIT_OBJECT_0 then
begin
//INFINITE
H := FindMainWindow(PI.dwProcessID);
if H>0 then
end;
end;

end;




纯冰糖 2009-03-17
  • 打赏
  • 举报
回复
H := FindMainWindow(PI.dwProcessID);
if H>0 then
...
end;

你代码都没写完全。
deansroom 2009-03-17
  • 打赏
  • 举报
回复
加上if WaitForSingleObject(PI.hProcess, INFINITE) = WAIT_OBJECT_0 then
这个判断还是不行 H还是等于0
deansroom 2009-03-17
  • 打赏
  • 举报
回复
if H>0 then
这句话就可以删除,有这句话是为了方便给H := FindMainWindow(PI.dwProcessID); 设置断点

1,183

社区成员

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

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