今天公司里几个高手先后看到我的程序
居然不约而同地给我同一个评价:“土”!
唉,真丢人。。。
今天21cn上不了,不知为何
干脆贴到这里来罢
其实这个程序主要的内容不是如何发qq信息
而是如何找到某一个正在运行的应用程序窗口上任意一个控件的句柄
我的方法是(以一个button为例)
用FindWindow找到窗体的句柄后
根据按钮的类别,循环找这个窗体上的每个'Button',然后用GetWindowText和Button的Caption比较,就可以找到想要的按钮句柄了
下面贴出我的程序,望大家批评指教
其中部分代码参考大富翁上某一帖子(忘了是哪个了)
To wjiachun:在下只想和大家交流交流,没敢要分
何况。。。这东西那么“土”。。。。
unit OicqSendForm;
interface
uses
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 if
end;
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.