我窗口上有个Edit1.里面有些数字比如电话号码.怎样才能实现按照编辑框中的数字依次发到UUCall网络电话程序上,就好象在键盘上输入数字一样(150分)

S

SP229

Unregistered / Unconfirmed
GUEST, unregistred user!
如题.
比如我编辑框中的数字为"076988564789".
我按一下发送按纽.在UUCall上自动.点它的'0','7','6'.....'9',就好象用鼠标在按上面的按键,或者在键盘上按数字键一样.
我搞了一天都没搞出来.求高手帮忙!!!
 
sendmessage 去网上搜下用法吧
可以直接往UUCALL的电话号码框里填数字,也可以模拟点击
 
搜出来很多,试过6个,没搞定,
 
先用 const BufPos:array[0..9] of TPoint;保存0-9这几个数据按钮位置,然后再解析是哪个数字,找到后po:=ClientToScreen(BufPos );
setcursorpos(po.X,po.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
 
那是不是就不能移动UUCall程序的位置
 
往电话号码框里填最简单,SETTEXT就可以
模拟点击就找到几个按纽的HANDLE,模拟点击就行嘛,看看我回答的这个贴子,你改下就差不多了
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3928297
 
go madeagle
在提问之前,我就有搜出你给的链接的贴子,没搞定,
 
procedure TForm1.Button6Click(Sender: TObject);
var
i: integer;
s: string;
Win:Hwnd;
btnhwnd:Hwnd;
begin
Win:=FindWindow(nil,'FrmMNDJ');
if Win= 0 then
exit;
//edit3中就是数字
for i := 1 to length(edit3.text)do
begin
s:=edit3.Text;
btnhwnd:= FindWindowEx(Win,0,'Tbutton',pchar(s));
if btnhwnd=0 then
exit else
begin
sendMessage(btnhwnd,WM_LBUTTONDOWN,0,0);
sendMessage(btnhwnd,WM_LBUTTONUP,0,0);
end;
sleep(1000);
end;
end;
 
to hying95
UUCall好象屏蔽了,收不到消息.
请老大们帮帮我.
 
UUCALL好象屏蔽了模拟消息,该怎么办.请各位老大帮忙.
 
没有屏蔽,经下列代码测试可用
var
Form1: TForm1;
ComNum:INTEGER;
implementation
{$R *.dfm}
function SplitString(Source, Deli: string ): TStringList;stdcall;
var
EndOfCurrentString: byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
while Pos(Deli, Source)>0do
begin
EndOfCurrentString := Pos(Deli, Source);
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
Result := StringList;
StringList.Add(source);
end;

// 获得窗口文本
function GetWndText(hWnd: HWND): String;
Var
Ret:LongInt;
mText:pChar;
Buf:Integer;
begin
Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;
GetMem(mText,Ret);
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_GETTEXT,Ret,Buf);
Result:=StrPas(mText);
finally
FreeMem(mText,Ret);
end;
end;

// 发送文本到窗口
procedure SetWndText(hWnd: HWND;
Text: String);
Var
//Ret:LongInt;
mText:pChar;
Buf:Integer;
begin
GetMem(mText,Length(Text));
StrCopy(mText,PChar(Text));
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_SETTEXT,0,Buf);
finally
FreeMem(mText,Length(Text));
end;
end;

// 取得窗口句柄
function GetSoftWnd(str:string): HWND;
var
hCurrentWindow: HWnd;
WndText:String;
begin
hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST);
while hCurrentWindow <> 0do
begin
WndText:=GetWndText(hCurrentWindow);
if Pos(str,WndText)>0 then
begin
Result:=hCurrentWindow;
Exit;
end;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
end;
Result:=0;
end;

//------取控件值并修改的几个函数结束-----------------------------------------
procedure TForm1.btn3Click(Sender: TObject);
function EnumChildWindowsProc(hwnd: Integer): Boolean;
stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,buffer,256);
//得到类名
if ComNum=5 then
SetWndText(hwnd,'111');
//根据序号修改该EDIT的值
Form1.Mmo1.Lines.add(inttostr(ComNum)+' ◆ '+GetWndText(hwnd)+' ◆ '+buffer);//加到Memo显示
inc(ComNum);
end;
var
hwnd: Integer;
//buffer: Array[0..1023] of Char;
begin

ComNum:=0;
Mmo1.Clear;
hwnd := GetSoftWnd('迷你版');
//得到目标窗口句柄
if hwnd<>0 then
EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@hwnd));
ComNum:=0;
end;
 
to madeagle
不是往TEDIT框中发送号码.而是模拟面板上的按键.0-9,*,#,Call按键.
用hying95的方法(我试过,自已写一个有数字键的工程,通过,但对UUCall无效,所以怀疑是被屏蔽了)
 
给你个思路吧,需要具体代码有空发上来,首先show出uucall的窗口 直接模拟键盘就完了,不然就要学习一下外挂的知识了,使用od找出关键call 然后用delphi调用,windows消息估计有些难
 
to moroko
期盼你用外挂的代码帮我解决!
 
其他代码不变
经测试完全通过,这个思路看来你还是没明白精髓
if ComNum=7 then
//按键2的序号
// SetWndText(hwnd,'111');
//改EIDT值
begin
sendMessage(hwnd,WM_LBUTTONDOWN,0,0);
//发送按键2
sendMessage(hwnd,WM_LBUTTONUP,0,0);
end;
 
to madeagle
procedure TForm1.Button1Click(Sender: TObject);
function EnumChildWindowsProc(hwnd: Integer): Boolean;
stdcall;
var
buffer: array[0..255] of Char;
i: integer;
s: string;
begin
Result := True;
GetClassName(hwnd,buffer,256);
//得到类名
for i := 1 to length(form1.Edit1.Text)do
begin
s:=form1.edit1.text;
ComNum:=strtoint(s)+6;
sendMessage(hwnd,WM_LBUTTONDOWN,0,0);
sendMessage(hwnd,WM_LBUTTONUP,0,0);
sleep(2000);
end;

Form1.Mmo1.Lines.add(inttostr(ComNum)+' ◆ '+GetWndText(hwnd)+' ◆ '+buffer);//加到Memo显示
inc(ComNum);
end;
var
hwnd: Integer;
//buffer: Array[0..1023] of Char;
begin
ComNum:=0;
Mmo1.Clear;
hwnd := GetSoftWnd('迷你版');
//得到目标窗口句柄
if hwnd<>0 then
EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@hwnd));
ComNum:=0;
end;

不管Form1.edit1.text的号码是多少,在UUCALL edit编辑框中都是123456789*0#
不知为何
 
那是你的逻辑问题,能弄进去一个,不能按顺序弄进去几个?我就晕了,呵呵
仔细看看你的程序流程吧,这情况不能再帮你了,仔细思考一下,很简单的
做个过程,每次进入一个数字
你都没看明白ComNum的作用,把程序从头读一遍你就知道怎么做了
 
通过ComNum把每个按键的句柄记录下来,用SENDMESSAGE来发送消息
在UUCALL不重新启动的情况下,按键的句柄是固定的
还是那句话,把示例看明白,领悟精髓再进行改造,呵呵
 
to madeagle

就想懒一下,不行了,只能再慢慢看下,没搞明白我晚上都睡不安宁(我刚入门,是业余爱好,没读两天书高中休业)
我原本想,弄一个自动拨号的,给自动的手机充值,因为每次充值时,都很麻烦,有时还把密码输错,因此就想自己编个小程序.自动拨号,把卡号密码填到编辑框中,让软件自动拨13800138000 然后停几秒,根据提示把该输入的都放到编辑框里面,直到输完密码.按确认键
后来在网上搜了一个,好象这个很难,通过网络电话是不能给手机充值的.
 
给你个全的吧,经测试通过,环境:WINXP
var
Form1: TForm1;
ComNum:INTEGER;
list:TStringList;
implementation
{$R *.dfm}

// 获得窗口文本
function GetWndText(hWnd: HWND): String;
Var
Ret:LongInt;
mText:pChar;
Buf:Integer;
begin
Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;
GetMem(mText,Ret);
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_GETTEXT,Ret,Buf);
Result:=StrPas(mText);
finally
FreeMem(mText,Ret);
end;
end;

// 发送文本到窗口
procedure SetWndText(hWnd: HWND;
Text: String);
Var
//Ret:LongInt;
mText:pChar;
Buf:Integer;
begin
GetMem(mText,Length(Text));
StrCopy(mText,PChar(Text));
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_SETTEXT,0,Buf);
finally
FreeMem(mText,Length(Text));
end;
end;

// 取得窗口句柄
function GetSoftWnd(str:string): HWND;
var
hCurrentWindow: HWnd;
WndText:String;
begin
hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST);
while hCurrentWindow <> 0do
begin
WndText:=GetWndText(hCurrentWindow);
if Pos(str,WndText)>0 then
begin
Result:=hCurrentWindow;
Exit;
end;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
end;
Result:=0;
end;

//------取控件值并修改的几个函数结束----------------------------------------------
//具体这么用

procedure TForm1.btn4Click(Sender: TObject);
function EnumChildWindowsProc(hwnd: Integer): Boolean;
stdcall;
var
buffer: array[0..255] of Char;
i:integer;
begin
Result := True;
GetClassName(hwnd,buffer,256);
//得到类名
if ComNum=5 then
list.Add('edit='+inttostr(hwnd));
//存号码框句柄
if ComNum in[6..18] then
//存按纽句柄
begin
list.Add(GetWndText(hwnd)+'='+inttostr(hwnd));
end;

// SetWndText(hwnd,'111');
//根据序号修改该EDIT的值
//sendMessage(hwnd,WM_LBUTTONDOWN,0,0);
//sendMessage(hwnd,WM_LBUTTONUP,0,0);
Form1.Mmo1.Lines.add(inttostr(ComNum)+' ◆ '+GetWndText(hwnd)+' ◆ '+buffer);//加到Memo显示
inc(ComNum);
end;
var
hwnd: Integer;
//buffer: Array[0..1023] of Char;
k:integer;
DiaNum:string;
s:string;
begin
list:=TStringList.Create;
ComNum:=0;
Mmo1.Clear;
hwnd := GetSoftWnd('迷你版');
//得到目标窗口句柄
if hwnd<>0 then
EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@hwnd));
ComNum:=0;
{
6 ◆ 1 ◆ Button
7 ◆ 2 ◆ Button
8 ◆ 3 ◆ Button
9 ◆ 4 ◆ Button
10 ◆ 5 ◆ Button
11 ◆ 6 ◆ Button
12 ◆ 7 ◆ Button
13 ◆ 8 ◆ Button
14 ◆ 9 ◆ Button
15 ◆ * ◆ Button
16 ◆ 0 ◆ Button
17 ◆ # ◆ Button
18 ◆ Call ◆ Button //拨号
}

DiaNum:= '13800138000' ;
hwnd:=StrToInt(list.Values['edit']);
SetWndText(hwnd,'0');
//清空号码框值 这里好象不能清空,要不出错,没查出原因,就加个前缀零吧
for k := 1 to length(DiaNum)do
begin
s:=DiaNum[k];
hwnd:=StrToInt(list.Values);
//showmessage(s);
sendMessage(hwnd,WM_LBUTTONDOWN,0,0);
sendMessage(hwnd,WM_LBUTTONUP,0,0);
//sleep(2000);
end;

hwnd:=StrToInt(list.Values['Call']);
//拨号
sendMessage(hwnd,WM_LBUTTONDOWN,0,0);
sendMessage(hwnd,WM_LBUTTONUP,0,0);
list.Free;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
867
DelphiTeacher的专栏
D
顶部