CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

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

楼主bitijjz1(刀锋战士)2002-04-07 15:10:25 在 Delphi / VCL组件开发及应用 提问

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

相关问题

  • Delphi代码翻译成BCB
  • VC代码转Delphi?
  • 哪位大侠能帮忙一下将这段 VC 代码翻译成 Delphi 代码, 不胜感谢!
  • 一段VB代码,请各位翻译成VC++代码,谢谢
  • 请把这些代码帮我翻译成 vc 代码?谢谢
  • 求助,VC翻译到Delphi?
  • 将一个C++代码翻译成delphi代码。
  • 一段VB代码,帮我翻译成Delphi代码,谢谢!!
  • 请翻译如下C代码至Delphi代码,感谢!
  • 谁能把下面的Delphi代码翻译成VB代码?

关键词

  • 函数
  • 代码
  • pstr
  • hedit
  • getdlgitem
  • ltrantext
  • hwnd
  • x00000001
  • hbutton
  • hhook

得分解答快速导航

  • 帖主:bitijjz1
  • gcj123
  • cplusc
  • copy_paste
  • smhpnuaa

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo