怎样用Spy++查看UC的“发送”按钮消息?BM_CLICK点不成功。

nonlyli 2005-08-28 04:07:36
想写个简单的UC自动发短信程序,用SPY++找到了窗体的“发送”按钮了,但用
SendMessage(hBtnSend,BM_CLICK,0,0)
不起作用,QQ之类的软件一试就准。

想用Spy++自己找消息的,不会找啊。只找到些LBUTTONDOWN(我也模拟过了,不起作用)。

弄了好几个小时了,请朋友帮忙!
...全文
322 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonlyli 2005-09-04
  • 打赏
  • 举报
回复
你写的代码真酷啊。跟我的初级代码没法比。
你习惯用C的习惯么?连string也不用,酷!

一定要拉上你找你好好学学。

现在还纳闷呢,怎么BM_CLICK消息就不行,要用WM_LBUTTONDOWN呢?
QQ等软件BM_CLICK就很好用呢……
nonlyli 2005-09-04
  • 打赏
  • 举报
回复
好的,谢谢。今天才来看帖。
thanks a lot!
Larry1030 2005-08-29
  • 打赏
  • 举报
回复
消息是肯定能起作用的, 关键是确认得到了按钮的句柄, 上面的代码
这两句应该有帮助的 
TempHandle:=Windows.GetParent(eHandle);
HLoginButton:= Windows.GetNextWindow(TempHandle,GW_HWNDNEXT);
Larry1030 2005-08-28
  • 打赏
  • 举报
回复
哈哈 , 没问题的话 就jf拉
Larry1030 2005-08-28
  • 打赏
  • 举报
回复
真巧, 我以前写过一个类是的程序, 是自动登陆的uc的 看看

TUCLogin = class(TObject)
private
FTimer: TTimer;
FUserId: String;
FPassword: String;
FApplicationPath: String;
public
constructor Create(AUserName , APassword, APath: String);
destructor Destroy; override;
procedure UCLogin;
procedure FTimerTimer(Sender: TObject);
end;


Var
UCHandle, //UC主窗口句柄
HPasswordEdit, //UC密码框句柄
HNumberCombo, //UC用户名编辑框
HLoginButton, //登陆按钮句柄
HSubFormHandle: THandle; //特殊按钮句柄

FUCVersion: PChar; //UC版本

implementation


{-------------------------------------------------------------------------------
过程名: FindUCWindow
说明: 查找系统中UC窗口的句柄
作者: Larry
日期: 2005.03.26
参数: 无
返回值: THandle
-------------------------------------------------------------------------------}
function FindUCWindow: THandle;

function GetSubForm(hwnd: HWND; lParam: LPARAM):Boolean; stdcall;
var
cName: array[0..128] of Char;
wName: array[0..128] of Char;
begin
result := true;
GetClassName(hwnd, cName, 128);
if StrPas(cName) = 'TUCTabSheet' then
begin
GetWindowText(hwnd, wName, 128);
if StrPas(wName) = 'UC号码'then
begin
PInteger(lParam)^ := hwnd;
result := false;
end;
end;
end;

function EnumWindowsFunc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
var
CName: array[0..128] of Char;
begin
Result := true;
if hwnd = 0 then Exit;
Windows.GetClassName(hwnd, CName, 128);
If StrPas(CName) <> 'TLoginForm' Then Exit;
EnumChildWindows(hwnd, @GetSubForm, Integer(@HSubFormHandle));
if HSubFormHandle <> 0 then
begin
UCHandle:= HSubFormHandle;
Result := False;
end;
end;

begin
UCHandle:= 0;
EnumWindows(@EnumWindowsFunc, 0);
Result:= UCHandle;
end;

{-------------------------------------------------------------------------------
过程名: GetUCHandle
说明: 取得UC窗口的各个编辑框以及登陆按钮的句柄
作者: Larry
日期: 2005.03.26
参数: 无
返回值: 无
-------------------------------------------------------------------------------}
procedure GetWindowHandle;
Var
eHandle,TempHandle: THandle;
begin
eHandle:= FindUCWindow;
if eHandle<>0 then
begin
HPasswordEdit:=Windows.FindWindowEx(eHandle,0,'TUCFlatEdit',nil);
HNumberCombo:=Windows.FindWindowEx(eHandle,0,'TXPComboBox',nil);
TempHandle:=Windows.GetParent(eHandle);
HLoginButton:= Windows.GetNextWindow(TempHandle,GW_HWNDNEXT);
end;
end;

{ TUCLogin }

constructor TUCLogin.Create(AUserName , APassword, APath: String);
begin
FUserId := AUserName;
FPassword := APassword;
FApplicationPath := APath;
Winexec(PChar(APath), SW_SHOW);
FTimer:= TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := FTimerTimer;
FTimer.Enabled := false;
end;


destructor TUCLogin.Destroy;
begin
FTimer.Free;
inherited;
end;

{-------------------------------------------------------------------------------
过程名: TUCLogin.FTimerTimer
说明: 启动UC后,计时器开始检测UC窗口的存在,
检测到了,发送用户名密码到指定编辑框再模拟点击UC登陆按钮完成登陆
作者: Larry
日期: 2005.03.26
参数: Sender: TObject
返回值: 无
-------------------------------------------------------------------------------}
procedure TUCLogin.FTimerTimer(Sender: TObject);
var
i: integer;
begin
GetWindowHandle;
If (HNumberCombo=0) or (HPasswordEdit=0) or (HLoginButton=0) Then Exit;
SendMessage(HNumberCombo, WM_SETTEXT, 0, Integer(FUserId));

For I:= 1 To Length(FPassword) Do
begin
SendMessage(HPasswordEdit, WM_CHAR, Integer(FPassword[I]), 0);
end;
SendMessage(HLoginButton, WM_LBUTTONDOWN, 0, 0);
SendMessage(HLoginButton, WM_LBUTTONUP, 0, 0);

FTimer.Enabled := False;
Free;
end;

procedure TUCLogin.UCLogin;
begin
FTimer.Enabled := True;
end;

内容概要:本文围绕双侧电源相间短路方向性电流保护的设计展开系统研究,重探讨了在复杂电力系统中实现可靠继电保护的关键技术。通过构建双侧电源供电系统的等效电路模型,分析了相间短路故障时短路电流的方向特性及其对保护动作的影响,提出了方向性电流保护的配置原则与整定方法。研究采用Simulink搭建完整的仿真平台,对三段式电流保护配合方向元件的工作逻辑进行了建模与验证,详细模拟了不同位置发生相间短路时保护装置的动作行为,确保选择性、灵敏性、速动性和可靠性。报告还深入讨论了功率方向继电器的工作原理,明确了正方向与反方向故障的判据,并通过仿真结果展示了方向闭锁机制的有效性。; 适合人群:适用于电气工程及相关专业本科生、研究生,以及从事电力系统继电保护设计与运维工作的工程技术人员;具备电路理论、电力系统分析基础的学习者更为适宜; 使用场景及目标:①掌握双侧电源系统中方向性电流保护的基本原理与设计流程;②学习利用Simulink进行电力系统故障仿真与保护逻辑验证的方法;③理解三段式电流保护在复杂网络结构中的配合关系与方向判别机制; 阅读建议:建议读者结合电力系统继电保护教材同步学习,重关注方向元件的动作条件与极性设置,在仿真过程中尝试改变故障位置与过渡电阻,观察保护动作情况,以深化对方向性判据的理解与实际应用能力。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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