有没有同时熟悉vc和delphi的朋友?帮我翻译这一段代码

bitijjz1 2002-04-07 03:10:25
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;
}
...全文
61 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hch_d 2002-04-08
  • 打赏
  • 举报
回复
关注中……
bitijjz1 2002-04-08
  • 打赏
  • 举报
回复
假如之后的话,那好想就没有意义了?我不想这个窗口出现啊!

有个朋友的方法不错:
xpony(xiezequn) ( ) 信誉:100 2002-04-08 16:01:00 得分:0
如果不让它看看太阳的话 就把它的位置搬家啊
.Left := -2000 ;
.Top :- -2000 ;
等确认要显示的时候把.Left,.Top改为正确的值
不过这样比较勉强 找到好方法不妨贴出来

你能帮我做出来吗?300分。
copy_paste 2002-04-08
  • 打赏
  • 举报
回复
WH_CALLWNDPROC,改为WH_GETMESSAGE试试
WH_CALLWNDPROC记得是所有处理的之前,
GetMessage好像是之后
bitijjz1 2002-04-08
  • 打赏
  • 举报
回复
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的地址。这估计是最后一个难点了。我都快虚脱了。。。。。。。。。。。。。。。。。。。
copy_paste 2002-04-08
  • 打赏
  • 举报
回复
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结构你得看你的源程序照着翻译了。
bitijjz1 2002-04-07
  • 打赏
  • 举报
回复
请把具体的代码写出来!我是菜鸟!
smhpnuaa 2002-04-07
  • 打赏
  • 举报
回复
也可以自己挂在comctl32.ocx上,然后用apihook修改函数地址!
smhpnuaa 2002-04-07
  • 打赏
  • 举报
回复
EnumWindows或者findwindow或者shellapi
bitijjz1 2002-04-07
  • 打赏
  • 举报
回复
木石三兄好厉害!,我已经开了另外一个帖子给你分,请搜索‘木十三’(对不起,一不小心打错了)。
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,这个方法可行吗?

大侠救我!!!!!!
copy_paste 2002-04-07
  • 打赏
  • 举报
回复
那可以用EnumWindows Api也写一个Delphi的GetDlgItem,呵呵你自己写吧
我记得很简单,我这里只有记事本,什么都做不了。
cplusc 2002-04-07
  • 打赏
  • 举报
回复
GetDlgItem(pStr->hwnd,0x00000001);
返回Dlg中的第一个子窗口句柄

如果你装了VC++, 看帮助吧
copy_paste 2002-04-07
  • 打赏
  • 举报
回复
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;
copy_paste 2002-04-07
  • 打赏
  • 举报
回复
GetDlgItem(pStr->hwnd,0x00000001);是MFC封装的东西,不知怎么写
bitijjz1 2002-04-07
  • 打赏
  • 举报
回复
谢谢两位!不过我的意思是:请帮我用delphi写出代码来。假如没空的话,不用测试。我自己琢磨着来测试就好了。
cplusc 2002-04-07
  • 打赏
  • 举报
回复
GetMsgProc :
模拟人工对特定对话框的文本输入框输入buf内容, 鼠标点击某个按钮,如果找不到特定对话框的文本输入框和按钮,则继续CallNextHookEx,

这段代码可能用于安装程序中自动填入相关信息,无需人工干预,

再,你的代码不全
佛的光辉 2002-04-07
  • 打赏
  • 举报
回复
第一个函数是一个自定义窗口函数,任何一个窗口都有一个这样的函数处理传递给窗口的消息,在这个自定义窗口函数只处理了WM_SHOWWINDOW消息,在这个函数的最后调用默认的窗口函数
第二个函数的作用是将第一个函数加在到窗口函数链的最前端

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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