高手请进,小弟有个问题请教!!!! 你不能通过指针操作窗口,因为那时TForm1类实例的指针,对于其他应用程序你不可能解析类,必须通过窗口句柄来操作窗口,关于如何得到窗口句柄可以搜索以前的帖子! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用findwindow得到button1所在窗体form1的句柄,使用EnumChildWindowsProc获得button1的句柄,我在DFW上看见人家写过一段操作QQ发送消息的代码,呵呵,作者自己说有点‘土’,不过看一看无伤大雅:unit OicqSendForm;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;type TfrmMain = class(TForm) memText: TMemo; edtTime: TEdit; Label1: TLabel; Bevel1: TBevel; Label2: TLabel; bbtnStart: TBitBtn; bbtnEnd: TBitBtn; bbtnHelp: TBitBtn; Timer: TTimer; procedure bbtnStartClick(Sender: TObject); procedure bbtnEndClick(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure bbtnHelpClick(Sender: TObject); private { Private declarations } FTextHandle: HWND; //qq消息输入框句柄 FButtonHandle: HWND; //发送按钮输入框 public { Public declarations } end;var frmMain: TfrmMain;implementation//这个函数取当前qq发送窗口上“送讯息”的按钮的句柄//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;var buffer: array[0..255] of Char; buffer1: array[0..255] of Char;begin Result := True; //得到目标窗口的控件 GetClassName(hwnd,buffer,256); //找到发消息的目标窗口的目标控件 if StrPas(Buffer)='Button' then begin GetWindowText(hwnd,buffer1,100); if buffer1 = '送讯息(&S)' then begin PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄) Result:=False; //终止循环 end; end;end;//end of function//这个函数取当前qq发送窗口上消息框句柄//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;var buffer: array[0..255] of Char; buffer1: array[0..255] of Char;begin Result := True; //得到目标窗口的控件 GetClassName(hwnd,buffer,256); //找到发消息的目标窗口的目标控件 if StrPas(Buffer)='Edit' then begin GetWindowText(hwnd,buffer1,100); PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄) Result:=False; //终止循环 end;end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);var Handle: Integer; tmpHandle: Integer;begin {取句柄} Handle := FindWindow(nil,'对话模式'); //就是窗口的Caption if Handle<>0 then begin tmpHandle := Handle; //在这里循环取到想要的句柄为止 //取发送按钮的,FButtonHandle EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle)); FButtonHandle := Handle; //取消息输入框的,FTextHandle EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle)); FTextHandle := tmpHandle; Timer.Interval := StrToInt(edtTime.Text); Timer.Enabled := true; end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);begin Timer.Enabled := false;//关闭定时器end;procedure TfrmMain.TimerTimer(Sender: TObject);begin {定时发送} //设发送文本 SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text))); //发送按钮 //SendMessage(FButtonHandle,BN_CLICKED,0,0); SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0); SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);var sHelp: String;begin //帮助 sHelp := '打开要发送的对象窗口'+#13+ '选择对话模式后点[开始]!'; ShowMessage(sHelp); end;end. 使用 findwindow得到窗体的句柄,使用循环判断的方法得到窗体上某一特定控件的句柄。在DFW上看见过一段代码,作者自己说有点‘土’,呵呵,我觉得还不错呀。看一看也能学到很多东西。unit OicqSendForm;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;type TfrmMain = class(TForm) memText: TMemo; edtTime: TEdit; Label1: TLabel; Bevel1: TBevel; Label2: TLabel; bbtnStart: TBitBtn; bbtnEnd: TBitBtn; bbtnHelp: TBitBtn; Timer: TTimer; procedure bbtnStartClick(Sender: TObject); procedure bbtnEndClick(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure bbtnHelpClick(Sender: TObject); private { Private declarations } FTextHandle: HWND; //qq消息输入框句柄 FButtonHandle: HWND; //发送按钮输入框 public { Public declarations } end;var frmMain: TfrmMain;implementation//这个函数取当前qq发送窗口上“送讯息”的按钮的句柄//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;var buffer: array[0..255] of Char; buffer1: array[0..255] of Char;begin Result := True; //得到目标窗口的控件 GetClassName(hwnd,buffer,256); //找到发消息的目标窗口的目标控件 if StrPas(Buffer)='Button' then begin GetWindowText(hwnd,buffer1,100); if buffer1 = '送讯息(&S)' then begin PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄) Result:=False; //终止循环 end; end;end;//end of function//这个函数取当前qq发送窗口上消息框句柄//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;var buffer: array[0..255] of Char; buffer1: array[0..255] of Char;begin Result := True; //得到目标窗口的控件 GetClassName(hwnd,buffer,256); //找到发消息的目标窗口的目标控件 if StrPas(Buffer)='Edit' then begin GetWindowText(hwnd,buffer1,100); PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄) Result:=False; //终止循环 end;end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);var Handle: Integer; tmpHandle: Integer;begin {取句柄} Handle := FindWindow(nil,'对话模式'); //就是窗口的Caption if Handle<>0 then begin tmpHandle := Handle; //在这里循环取到想要的句柄为止 //取发送按钮的,FButtonHandle EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle)); FButtonHandle := Handle; //取消息输入框的,FTextHandle EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle)); FTextHandle := tmpHandle; Timer.Interval := StrToInt(edtTime.Text); Timer.Enabled := true; end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);begin Timer.Enabled := false;//关闭定时器end;procedure TfrmMain.TimerTimer(Sender: TObject);begin {定时发送} //设发送文本 SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text))); //发送按钮 //SendMessage(FButtonHandle,BN_CLICKED,0,0); SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0); SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);var sHelp: String;begin //帮助 sHelp := '打开要发送的对象窗口'+#13+ '选择对话模式后点[开始]!'; ShowMessage(sHelp); end;end. OPENDERPROCESSSReadmemoeryprocesswritememoproscessdelphi 帮助下有梨题 我顶,如果谁能回答的让我满意我给500分,决不失言!!!!!!!!再说一次我要得到的不是句柄,而是 artman 老兄说的TFORM1类的实例的指针. TfileStream中的read函数参数疑惑? 请问各位,我怎么不能向SQLSERVER数据库插入超过15个字符的字符串,代码如下 急!!高分求救,如何在明细表中设置过滤条件? access数据库怎么样和odbc连接。 怎样发送Raw IP数据包 DBGrid的动态生成问题?UP有分,不够再加 什么打包工具生成文件比较小? 关于一段递归程序 我想对DBGRID中的行进行操作,最好是单击其中一行,程序就能知道他的值 在使用ADOQuery时,如果执行结果为空时,如何关闭ADOQuery? 这个SQL条件语句不知道怎么写(还是不懂)? 求救二维动态数组做参数传递问题!!!
unit OicqSendForm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;type
TfrmMain = class(TForm)
memText: TMemo;
edtTime: TEdit;
Label1: TLabel;
Bevel1: TBevel;
Label2: TLabel;
bbtnStart: TBitBtn;
bbtnEnd: TBitBtn;
bbtnHelp: TBitBtn;
Timer: TTimer;
procedure bbtnStartClick(Sender: TObject);
procedure bbtnEndClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure bbtnHelpClick(Sender: TObject);
private
{ Private declarations }
FTextHandle: HWND; //qq消息输入框句柄
FButtonHandle: HWND; //发送按钮输入框
public
{ Public declarations }
end;var
frmMain: TfrmMain;implementation
//这个函数取当前qq发送窗口上“送讯息”的按钮的句柄
//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Button' then
begin
GetWindowText(hwnd,buffer1,100);
if buffer1 = '送讯息(&S)' then
begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;
end;//end of function//这个函数取当前qq发送窗口上消息框句柄
//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Edit' then
begin
GetWindowText(hwnd,buffer1,100);
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);
var
Handle: Integer;
tmpHandle: Integer;
begin
{取句柄}
Handle := FindWindow(nil,'对话模式'); //就是窗口的Caption
if Handle<>0 then
begin
tmpHandle := Handle;
//在这里循环取到想要的句柄为止
//取发送按钮的,FButtonHandle
EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle));
FButtonHandle := Handle; //取消息输入框的,FTextHandle
EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
FTextHandle := tmpHandle; Timer.Interval := StrToInt(edtTime.Text);
Timer.Enabled := true;
end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);
begin
Timer.Enabled := false;//关闭定时器
end;procedure TfrmMain.TimerTimer(Sender: TObject);
begin
{定时发送}
//设发送文本
SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text))); //发送按钮
//SendMessage(FButtonHandle,BN_CLICKED,0,0);
SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);
end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);
var
sHelp: String;
begin
//帮助
sHelp := '打开要发送的对象窗口'+#13+
'选择对话模式后点[开始]!';
ShowMessage(sHelp); end;end.
unit OicqSendForm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;type
TfrmMain = class(TForm)
memText: TMemo;
edtTime: TEdit;
Label1: TLabel;
Bevel1: TBevel;
Label2: TLabel;
bbtnStart: TBitBtn;
bbtnEnd: TBitBtn;
bbtnHelp: TBitBtn;
Timer: TTimer;
procedure bbtnStartClick(Sender: TObject);
procedure bbtnEndClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure bbtnHelpClick(Sender: TObject);
private
{ Private declarations }
FTextHandle: HWND; //qq消息输入框句柄
FButtonHandle: HWND; //发送按钮输入框
public
{ Public declarations }
end;var
frmMain: TfrmMain;implementation
//这个函数取当前qq发送窗口上“送讯息”的按钮的句柄
//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Button' then
begin
GetWindowText(hwnd,buffer1,100);
if buffer1 = '送讯息(&S)' then
begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;
end;//end of function//这个函数取当前qq发送窗口上消息框句柄
//function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Edit' then
begin
GetWindowText(hwnd,buffer1,100);
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);
var
Handle: Integer;
tmpHandle: Integer;
begin
{取句柄}
Handle := FindWindow(nil,'对话模式'); //就是窗口的Caption
if Handle<>0 then
begin
tmpHandle := Handle;
//在这里循环取到想要的句柄为止
//取发送按钮的,FButtonHandle
EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle));
FButtonHandle := Handle; //取消息输入框的,FTextHandle
EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
FTextHandle := tmpHandle; Timer.Interval := StrToInt(edtTime.Text);
Timer.Enabled := true;
end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);
begin
Timer.Enabled := false;//关闭定时器
end;procedure TfrmMain.TimerTimer(Sender: TObject);
begin
{定时发送}
//设发送文本
SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text))); //发送按钮
//SendMessage(FButtonHandle,BN_CLICKED,0,0);
SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);
end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);
var
sHelp: String;
begin
//帮助
sHelp := '打开要发送的对象窗口'+#13+
'选择对话模式后点[开始]!';
ShowMessage(sHelp); end;end.
Readmemoeryprocess
writememoproscessdelphi 帮助下有梨题
再说一次我要得到的不是句柄,而是 artman 老兄说的TFORM1类的实例的指针.