type PData = ^TData; TData = record Index: Integer; // want to find index Value: Integer; // enum child times hwnd: THandle; // return find hwnd end;function EnumChildProc(hwnd: THandle; lParam: Integer): Boolean; stdcall; var Data: PData; begin Data := PData(lParam); Result := Data^.Index <> Data^.Value; if not Result then Data^.hwnd := hwnd; Inc(Data.Value); end;function GetDlgItem(Handle: THandle; Index: Integer): THandle; var Data: TData; begin FillChar(Data, SizeOf(Data), 0); Data.Index := Index; EnumChildWindows(Handle, @EnumChildProc, Integer(@Data)); Result := Data.hwnd; end; 相对应的程序改为: var hEdit: THandle; hButton: THandle; begin ... hEdit := GetDlgItem(pStr^.hwnd, 1); if hEdit = 0 then begin Result := 1; Exit; end; Sendmessage(hEdit, ...);
模拟人工对特定对话框的文本输入框输入buf内容, 鼠标点击某个按钮,如果找不到特定对话框的文本输入框和按钮,则继续CallNextHookEx,这段代码可能用于安装程序中自动填入相关信息,无需人工干预,再,你的代码不全
PWPSStruc = ^TWPSStruc;
TWPSStruc = record
hwnd: THandle;
message: UINT;
end;var
buf: PChar;
hHook: HHOOK; function GetMsgProc(code: Integer; wParam: WPARAM; lParam: WPARAM): Integer; stdcall;
var
pStr: PWPSStruc;
begin
buffer := 'Hello';
pStr := PWPSStruc(lParam);
if pStr^.message = WM_SHOWWINDOW then
begin
if pStr^.hwnd = 0 then
begin
Result = 1 ;
Exit;
end;
SendMessage(pStr^.hwnd, WM_SETTEXT, 0, Integer(Pointer(Buffer)));
//GetDlgItem(pStr->hwnd,0x00000001);
SendMessage(pStr^.hwnd, WM_LBUTTONDOWN, 0, 0);
SendMessage(pStr^.hwnd, WM_lBUTTONUP, 0, 0);
end;
Result := CallNextHookEx(hHook, code, wParam, lParam);
end;function SetHook(hwnd: THandle; lTranText: PChar): Integer;
begin
hHook := SetWindowsHookEx(WH_CALLWNDPROC, GetMsgProc, HInstance, 0);
if hHook <> 0 then
begin
ZeroMemory(Buf, 100);
Move(lTranText^, buf^, strlen(lTrantext));
end;
Result := 1;
end;
返回Dlg中的第一个子窗口句柄如果你装了VC++, 看帮助吧
我记得很简单,我这里只有记事本,什么都做不了。
5i海洋兄,我在结贴的时候在给你分吧!但是,我用SendMessage(GetDlgItem(cs.hwnd,$00000480), WM_SETTEXT, 0, longint(pchar('hello')));并不能成功给edit赋值。这一句一点反应也没有。怎么回事哪?
另外我已经实现在我所感兴趣的窗口 wm_create之前hook。但是,用的是SetWindowsHookEx(WH_CALLWNDPROC,proc,hinstance,0); 假如使用WH_CALLWNDPROCRET,会不会达不到我‘不出现对话框’的问题哪?假如我想不出现对话框,并且给 opendialog1.filename 赋值,该怎么办哪?此处的opendialog1就是我所感兴趣的窗口,我已经hook到了。我有一个想法:让opendialog1.visible:=false !,然后再给edit赋值,虚拟点击button,这个方法可行吗?大侠救我!!!!!!
PData = ^TData;
TData = record
Index: Integer; // want to find index
Value: Integer; // enum child times
hwnd: THandle; // return find hwnd
end;function EnumChildProc(hwnd: THandle; lParam: Integer): Boolean; stdcall;
var
Data: PData;
begin
Data := PData(lParam);
Result := Data^.Index <> Data^.Value;
if not Result then
Data^.hwnd := hwnd;
Inc(Data.Value);
end;function GetDlgItem(Handle: THandle; Index: Integer): THandle;
var
Data: TData;
begin
FillChar(Data, SizeOf(Data), 0);
Data.Index := Index;
EnumChildWindows(Handle, @EnumChildProc, Integer(@Data));
Result := Data.hwnd;
end;
相对应的程序改为:
var
hEdit: THandle;
hButton: THandle;
begin
...
hEdit := GetDlgItem(pStr^.hwnd, 1);
if hEdit = 0 then
begin
Result := 1;
Exit;
end;
Sendmessage(hEdit, ...);
hButton 类同
...
end;
我只是试过GetDlgitem可以运作,其它的你得自己作了。
TWPSStruc结构你得看你的源程序照着翻译了。
SendMessage(oe, WM_SETTEXT, wparam(1148), longint(pchar('hello')));我用以上代码发现,对话框的文件名输入框的hwnd为1148(10进制),但是,只有我在第二次进入对话框的时候,这个输入框才有‘hello’,而第一次进入是没有的!这是为什么呢?
我的hook类型是:
SetWindowsHookEx(WH_CALLWNDPROC,proc,hinstance,0);
事件类型是:
if cs.message=WM_showwindow then还有,我看不懂winsight32。所以,无法看到设置 visible的地址。这估计是最后一个难点了。我都快虚脱了。
WH_CALLWNDPROC记得是所有处理的之前,
GetMessage好像是之后
xpony(xiezequn) ( ) 信誉:100 2002-04-08 16:01:00 得分:0
如果不让它看看太阳的话 就把它的位置搬家啊
.Left := -2000 ;
.Top :- -2000 ;
等确认要显示的时候把.Left,.Top改为正确的值
不过这样比较勉强 找到好方法不妨贴出来
你能帮我做出来吗?300分。