有没有同时熟悉vc和delphi的朋友?帮我翻译这一段代码
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT* pStr;
pStr=(CWPSTRUCT*)lParam;
if(pStr->message==WM_SHOWWINDOW)
{
HWND hEdit=GetDlgItem(pStr->hwnd,0x00000480);
if(hEdit==NULL)
{
//::MessageBox(NULL,"Edit NULL","",MB_OK);
return 1;
}
::SendMessage(hEdit,WM_SETTEXT,(WPARAM)0,(LPARAM)buf);
HWND hButton=GetDlgItem(pStr->hwnd,0x00000001);
if(hButton==NULL)
{
return 1;
}
::SendMessage(hButton,WM_LBUTTONDOWN,(WPARAM)0,(LPARAM)0);
::SendMessage(hButton,WM_LBUTTONUP,(WPARAM)0,(LPARAM)0);
}
return CallNextHookEx(hHook,code,wParam,lParam);
}
int SetHook(HWND hwnd,LPCTSTR lTranText)
{
hHook=SetWindowsHookEx(WH_CALLWNDPROC,GetMsgProc,hinstance,0);
if(hHook==NULL)
MessageBox(NULL,"2","",MB_OK);
ZeroMemory(buf,100);
strcpy(buf,lTranText);
return 1;
}
问题点数:100、回复次数:16Top
1 楼gcj123(佛的光辉)回复于 2002-04-07 15:33:41 得分 10
第一个函数是一个自定义窗口函数,任何一个窗口都有一个这样的函数处理传递给窗口的消息,在这个自定义窗口函数只处理了WM_SHOWWINDOW消息,在这个函数的最后调用默认的窗口函数
第二个函数的作用是将第一个函数加在到窗口函数链的最前端Top
2 楼cplusc(5i海洋)回复于 2002-04-07 15:36:08 得分 30
GetMsgProc :
模拟人工对特定对话框的文本输入框输入buf内容, 鼠标点击某个按钮,如果找不到特定对话框的文本输入框和按钮,则继续CallNextHookEx,
这段代码可能用于安装程序中自动填入相关信息,无需人工干预,
再,你的代码不全Top
3 楼bitijjz1(刀锋战士)回复于 2002-04-07 16:39:59 得分 0
谢谢两位!不过我的意思是:请帮我用delphi写出代码来。假如没空的话,不用测试。我自己琢磨着来测试就好了。Top
4 楼copy_paste(木石三)回复于 2002-04-07 16:52:52 得分 50
GetDlgItem(pStr->hwnd,0x00000001);是MFC封装的东西,不知怎么写
Top
5 楼copy_paste(木石三)回复于 2002-04-07 16:57:12 得分 0
type
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;
Top
6 楼cplusc(5i海洋)回复于 2002-04-07 17:01:45 得分 0
GetDlgItem(pStr->hwnd,0x00000001);
返回Dlg中的第一个子窗口句柄
如果你装了VC++, 看帮助吧Top
7 楼copy_paste(木石三)回复于 2002-04-07 17:06:09 得分 0
那可以用EnumWindows Api也写一个Delphi的GetDlgItem,呵呵你自己写吧
我记得很简单,我这里只有记事本,什么都做不了。
Top
8 楼bitijjz1(刀锋战士)回复于 2002-04-07 17:38:59 得分 0
木石三兄好厉害!,我已经开了另外一个帖子给你分,请搜索‘木十三’(对不起,一不小心打错了)。
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,这个方法可行吗?
大侠救我!!!!!!Top
9 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-04-07 20:03:46 得分 10
EnumWindows或者findwindow或者shellapiTop
10 楼smhpnuaa(天将降大任于斯人也!)回复于 2002-04-07 20:05:44 得分 0
也可以自己挂在comctl32.ocx上,然后用apihook修改函数地址!Top
11 楼bitijjz1(刀锋战士)回复于 2002-04-07 20:55:21 得分 0
请把具体的代码写出来!我是菜鸟!Top
12 楼copy_paste(木石三)回复于 2002-04-08 13:33:40 得分 0
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, ...);
hButton 类同
...
end;
我只是试过GetDlgitem可以运作,其它的你得自己作了。
TWPSStruc结构你得看你的源程序照着翻译了。Top
13 楼bitijjz1(刀锋战士)回复于 2002-04-08 14:33:56 得分 0
oe := GetDlgItem(cs.hwnd,1148);
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的地址。这估计是最后一个难点了。我都快虚脱了。。。。。。。。。。。。。。。。。。。Top
14 楼copy_paste(木石三)回复于 2002-04-08 14:41:18 得分 0
WH_CALLWNDPROC,改为WH_GETMESSAGE试试
WH_CALLWNDPROC记得是所有处理的之前,
GetMessage好像是之后Top
15 楼bitijjz1(刀锋战士)回复于 2002-04-08 18:32:14 得分 0
假如之后的话,那好想就没有意义了?我不想这个窗口出现啊!
有个朋友的方法不错:
xpony(xiezequn) ( ) 信誉:100 2002-04-08 16:01:00 得分:0
如果不让它看看太阳的话 就把它的位置搬家啊
.Left := -2000 ;
.Top :- -2000 ;
等确认要显示的时候把.Left,.Top改为正确的值
不过这样比较勉强 找到好方法不妨贴出来
你能帮我做出来吗?300分。Top
16 楼hch_d(城城)回复于 2002-04-08 19:35:06 得分 0
关注中……Top




