首页
社区
课程
招聘
请教一下 Nowell 关于Delphi 代码的
发表于: 2005-6-20 15:01 6271

请教一下 Nowell 关于Delphi 代码的

2005-6-20 15:01
6271
请教一下 Nowell,记得你是有用 Delphi 的,问一下:

不知你有没有用 Delphi 做过 Edit 的消息截获处理,这里指的窗体和Edit不是可视化构件对象生成的 name 那种,而是用资源文本文件(再编译)或资源工具做出来的资源文件,是用 ID 做控件识别的那种

定义了控件ID标识:
const
MYICO =             1000 ; // ico
IDB_DONE =          1001 ; // button
IDB_CANCEL =        1002 ; // button
IDE_FIRST =         1003 ; // edit
IDE_SECOND =        1004 ; // edit
IDE_THREE =         1005 ; // edit
IDR_MAINFRAME =     1006 ;  // Dlg

要做个窗口函数:
function DlgProc( Wnd: hWnd; Msg:Cardinal ; wParam: word; lParam: LongInt ):Boolean; stdcall;
当中有窗口消息分类暂有如下:
case Msg of
{
WM_CLOSE: //ok
WM_INITDIALOG: // ok
WM_COMMAND: //只做了button的Click消息处理
}

调用:
DialogBoxParam( g_dllhmod, PChar( DlgTemplate), g_hwndmain, @DlgProc, 0 ); // 调用Dll的窗体

///////////////////
我想做 Edit 控件的输入包括键盘和剪贴板的监视,好像做成ImptRec或LordPE(不想用SetWindowsHookEx)的地址输入监视一样(主要是 EDIT 控件的消息获取),根据上面的事例不知要怎样安排写这部分的代码呢?(最好贴出来)

keyboard 发送? WM_CHAR 102

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
2
用SetWindowLong设定按钮自己的DlgProc处理函数。。。
2005-6-20 16:35
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
3
最初由 xIkUg 发布
用SetWindowLong设定按钮自己的DlgProc处理函数。。。


不是按钮函数(已经做成了,不用担心),是监视 EDIT 输入的CallBack函数才是,兄弟能按上面的要求放个例子上来(对于你来说应该不是问题)吗?
2005-6-21 11:52
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
4
可以在自己设定的按钮回调窗口函数中监视。。。

我手里没有现成的代码。。。
把你的代码打包发上来,我帮你改
2005-6-21 13:53
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
5
// 我想做LordPE Dump的Edit控件实时检测输入[包括键盘和剪切板](不是做击中按钮函数),帮我看看

library TEST;

uses
  Windows,
  SysUtils,
  Messages,
  Classes,
  Plugin;
Type
  TBuffer = array[1..256] of Char;
resourcestring
  VERSION = '1.0';
  AUTHOR  = 'askformore';
  PLUGIN_NAME = 'TEST';
  ABOUT   = 'TEST pluin v1.0'#13#10#13#10'This plugin for OllyDbg1.10'#13#10'Compiled with Delphi7'#13#10#13#10'By askformore'#13#10#13#10'Thanks to:'#13#10'          TQN provide Delphi-SDK!';

{$R ActionOptionDlg.RES}

const
MYICO =             1000 ;
IDB_DONE =          1001 ;
IDB_CANCEL =        1002 ;
IDE_STARTBASE =    1003 ;
IDE_STARTEND =     1004 ;
IDE_CODEBASE =      1005 ;
IDR_MAINFRAME =     1006 ;
MYDLG=       'IDD_ACTION';

var
  g_hwndOlly: HWND;
  g_dllhmod: HMODULE;
  SaveDLLProc: TDLLProc;

procedure IsFixInput( Wnd: hWnd);
var
msg: Tmsg;
Key: char;
begin
  if Msg.message  =WM_KeyDown then
    begin
              key :=   Char(low(msg.wParam));
              if not ( Key in  ['0'..'9', 'A'..'F', 'a'..'f', #8]) then
                 msg.wParam   := 0;
    end;
end;

function GetCheck(Src: TBuffer): TBuffer;
var
tmp : string;
i,Len : integer;
begin
  tmp   := '';
  for i:=1 to Length(Src) do
  begin
      if Src[i]= '' then
         break;
  end;
  if i=1 then
  Len :=1
  else
  Len := i-1;

  for i:=1 to Len do
    begin

         if Src[i] in ['0'..'9','A'..'F','a'..'F'] then
            begin
              tmp := tmp + Src[i];
            end
         else
            begin
              tmp := 'Invalid!';
              break;
            end;
   end;
  ZeroMemory(@Result,256);
  for i:=1 to length(Tmp) do
     begin
       Result[i]:= tmp[i];
     end;
end;

function DlgProc( Wnd: hWnd; Msg:Cardinal ;wParam: wParam; lParam: LongInt ):Boolean; stdcall;
var
STARTBASE,STARTEND,CodeBase: TBuffer;
hmainico: DWORD;
whoid   : WORD;

begin
Case Msg of

   WM_CLOSE:
            begin
              EndDialog(Wnd,0);
              Result := True;
              Exit;
            end;

   WM_INITDIALOG:
            begin
              SetDlgItemText(Wnd, IDE_CODEBASE, PChar( '00401000' ) );
              hmainico:=LoadIcon(g_dllhmod, PChar(MYICO));
              SendMessage(Wnd,WM_SETICON, ICON_SMALL, hmainico);
              Result := True;
              Exit;
            end;

  WM_COMMAND:
            begin
               whoid:=wParam;
            Case whoid of
IDE_STARTBASE : IsFixInput(IDE_STARTBASE);

IDE_STARTEND :  IsFixInput(IDE_STARTEND);

IDE_CODEBASE :   IsFixInput(IDE_CODEBASE);

IDB_DONE:
             begin
               GetDlgItemText(Wnd, IDE_STARTBASE, @STARTBASE, 256 );
                STARTBASE := GetCheck(STARTBASE);
               SetDlgItemText(Wnd, IDE_STARTBASE , @STARTBASE);

               GetDlgItemText(Wnd, IDE_STARTEND, @STARTEND, 256 );
                STARTEND := GetCheck(STARTEND);
               SetDlgItemText(Wnd, IDE_STARTEND, @STARTEND );

               GetDlgItemText(Wnd, IDE_CODEBASE, @CodeBase, 256 );
                CodeBase := GetCheck(CodeBase);
               SetDlgItemText(Wnd, IDE_CODEBASE, @CodeBase );
               Result := True ;
               Exit;
             end;

IDB_CANCEL:
             begin
               SendMessage(Wnd,WM_CLOSE, 0, 0);
               Result := True ;
               Exit;
               {------------<Cancel被按下,退出>}
             end;

         end;  // end case wm_cmd
     end;  // end wm_cmd
end; // end Case msg
Result := False;
end;       // 窗口消息循环函数

function ODBG_Plugindata(name: PChar): Integer; cdecl;
begin
  StrLCopy(name, PChar(PLUGIN_NAME), 32); // Name of plugin
  Result := PLUGIN_VERSION;
end;

function ODBG_Plugininit(ollydbgversion: Integer; hWndOlly: HWND; features: PULONG): Integer; cdecl;
begin
  if (ollydbgversion < PLUGIN_VERSION) then  // 比较OD版本
  begin
    Result := -1;
    Exit;
  end;

  g_hwndOlly := hWndOlly;
  Addtolist(0, 0, 'TEST Plugin  - Ver %s by %s', VERSION, AUTHOR);

  Result := 0;
end;

function ODBG_Pluginmenu(origin: Integer; pData: PChar; pItem: Pointer): Integer; cdecl;
begin
  case origin of
    PM_MAIN:
      begin
        // 在主窗口的插件菜单
        StrCopy(pData, '0 &Action, 1 &About...');
        Result := 1;
      end;
  else
    Result := 0; // Any other window
  end;
end;

procedure ODBG_Pluginaction(origin: Integer; action: Integer; pItem: Pointer); cdecl;

begin
  if (origin = PM_MAIN) then
  begin
    case action of
      0: DialogBoxParam( g_dllhmod, PChar(MYDLG), g_hwndOlly, @DlgProc, 0 );
      1: MessageBox( g_hwndOlly, PChar(ABOUT), PChar(PLUGIN_NAME), MB_ICONASTERISK );
    end;
  end;
end;

procedure DLLExit(dwReason: DWORD);
begin
  if (dwReason = DLL_PROCESS_DETACH) then
  begin
    // 这里输出初始化代码失败
    OutputDebugString('Plugin unloaded by DLL_PROCESS_DETACH');
  end;

  // 调用保存 入口过程
  if Assigned(SaveDLLProc) then
    SaveDLLProc(dwReason);
end;

exports
  ODBG_Plugindata   name '_ODBG_Plugindata',
  ODBG_Plugininit   name '_ODBG_Plugininit',
  ODBG_Pluginmenu   name '_ODBG_Pluginmenu',
  ODBG_Pluginaction name '_ODBG_Pluginaction';

begin
  // 这里初始化代码
  g_dllhmod := GetModuleHandle( PChar( PLUGIN_NAME+'.dll' ) );
  SaveDLLProc := @DLLProc;
  DLLProc := @DLLExit;
end.
2005-6-21 22:34
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
6
编译不过,缺少ActionOptionDlg.RES
2005-6-22 09:49
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
function DlgProc( Wnd: hWnd; Msg:Cardinal ;wParam: wParam; lParam: LongInt Boolean; stdcall;
var
STARTBASE,STARTEND,CodeBase: TBuffer;
hmainico: DWORD;
whoid   : WORD;

begin
Case Msg of

   WM_CLOSE:
            begin
              EndDialog(Wnd,0);
              Result := True;
              Exit;
            end;

   WM_INITDIALOG:
            begin
              SetDlgItemText(Wnd, IDE_CODEBASE, PChar( '00401000' ) );
              hmainico:=LoadIcon(g_dllhmod, PChar(MYICO));
              SendMessage(Wnd,WM_SETICON, ICON_SMALL, hmainico);
              Result := True;
              Exit;
            end;

  WM_COMMAND:
            begin
               whoid:=wParam;
            Case whoid of

//在这里加一句这个就可以实时监视Edit的文本更新了
IDE_STARTBASE: if (wParam shr 16) = EN_CHANGE then IsFixInput(IDE_STARTBASE);

IDE_STARTBASE : IsFixInput(IDE_STARTBASE);

IDE_STARTEND :  IsFixInput(IDE_STARTEND);

IDE_CODEBASE :   IsFixInput(IDE_CODEBASE);

IDB_DONE:
             begin
               GetDlgItemText(Wnd, IDE_STARTBASE, @STARTBASE, 256 );
                STARTBASE := GetCheck(STARTBASE);
               SetDlgItemText(Wnd, IDE_STARTBASE , @STARTBASE);

               GetDlgItemText(Wnd, IDE_STARTEND, @STARTEND, 256 );
                STARTEND := GetCheck(STARTEND);
               SetDlgItemText(Wnd, IDE_STARTEND, @STARTEND );

               GetDlgItemText(Wnd, IDE_CODEBASE, @CodeBase, 256 );
                CodeBase := GetCheck(CodeBase);
               SetDlgItemText(Wnd, IDE_CODEBASE, @CodeBase );
               Result := True ;
               Exit;
             end;

IDB_CANCEL:
             begin
               SendMessage(Wnd,WM_CLOSE, 0, 0);
               Result := True ;
               Exit;
               {------------<Cancel被按下,退出>}
             end;

         end;  // end case wm_cmd
     end;  // end wm_cmd
end; // end Case msg
Result := False;
end;
2005-6-22 14:32
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
呵呵,我又看了一下你的程序,还是不太明白你的意思,我看见你上面的程序不是已经实现了Edit不断的检测输入了吗?

IDE_STARTBASE : IsFixInput(IDE_STARTBASE);

IDE_STARTEND :  IsFixInput(IDE_STARTEND);

IDE_CODEBASE :   IsFixInput(IDE_CODEBASE);
2005-6-22 14:54
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
9
to xIkUg:

在我那里是能编译的,是要资源文件的,也很容易做(ID常量定义对应就是啦),但我关心的是消息截获的实现代码如何安排,对于会Delphi的,应该能看出我代码的失误之处,所以不发也应该没所谓

to 小虾:
我看见你上面的程序不是已经实现了Edit不断的检测输入了吗?
那是我头一个简单的测试,如果我的要求成功了那就是多余的

我搞不懂如何安排实时检测的代码,上面三行红色乱写出来的(有需要的话完全可以删除的),虽然能编译,但测试不到我要的效果;我好像要过滤检测的是这个 WM_CHAR 102 和 一个粘贴消息,你给的这个好像检测已经更改了,我要的是在用户做出键盘和粘贴动作时截获,如果输入的内容不符合要求的,就消息改为空。。。不知上面的代码能如何修改达到这个效果
2005-6-22 15:44
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
那我上面给的应该是可以的。EN_CHANGE消息是Edit的消息,表示当Edit的本文更新后将会发送给窗口的消息,只要截获这个消息就可以监视Edit的本文更新了。

IDE_STARTBASE: if (wParam shr 16) = EN_CHANGE then IsFixInput(IDE_STARTBASE);
2005-6-22 18:03
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
其余上面我修改的消息代码在Delphi中就是OnEdit1Change事件
2005-6-22 18:12
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
12
我是懒人。。。呵呵。。。
小虾的方法也可以。。。

我给你说的方法如下,你可以试试:
在WM_INITDIALOG的时候做
oldEditProc := Pointer(SetWindowLong(hSn, GWL_WNDPROC, integer(@EditProc)));

然后你就可以在你自己的EditProc中处理(监视/检测)输入了,这样做更过程化和模块化
function EditProc(hWnd, Msg, wParam, lParam: Longint): Longint; stdcall;
begin
  // todo: 添加自己要处理的消息事件到case结构中
  case Msg of
    WM_CHAR:
    begin
    // todo: 处理wm_char消息
    end;
    WM_COPY:
    begin
    // todo: 处理WM_COPY消息
    end;
  else
    CallWindowProc(oldEditProc, hwnd, Msg, wParam, lParam);
  end;
  Result := 1;
end;
2005-6-23 09:54
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
13
应该说我比你更懒!

Thank you!
2005-6-23 11:13
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
14
WM_CHAR消息划分好像不能存在似,
只要设定了这个消息过滤,就将我键盘的所有非系统键都屏蔽了,
而且这个消息根本不会激活?但我看LordPE都是用这个消息的,真是又怪。。。

现在只能是用: WM_KEYDOWN
2005-6-23 23:05
0
游客
登录 | 注册 方可回帖
返回
//