码迷,mamicode.com
首页 > Web开发 > 详细

盒子 收藏帖子 转移-实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录

时间:2015-02-13 22:25:18      阅读:798      评论:0      收藏:0      [点我收藏+]

标签:

//实现向网页自动填写用户名密码并自动点击登录按钮  完成全自动凳录

Function FillForm(WebBrowser: TWebBrowser2; FieldName: String; Value: String):
  Boolean;
Var
  i, j: Integer;
  FormItem: Variant;
Begin
  Result := False;
  //no form on document
  If WebBrowser.OleObject.Document.all.tags(FORM).Length = 0 Then
    Begin
      Exit;
    End;
  For I := 0 To WebBrowser.OleObject.Document.forms.Length - 1 Do
    Begin
      FormItem := WebBrowser.OleObject.Document.forms.Item(I);
      For j := 0 To FormItem.Length - 1 Do
        Begin
          Try
          //when the fieldname is found, try to fill out
          If FormItem.Item(j).Name = FieldName Then
          Begin
          FormItem.Item(j).Value := Value;
          Result := True;
          End;
          Except
          Exit;
          End;
        End;
    End;
End;

FillForm(浏览器控件名称, 编辑框名称, 内容)

 str := (Webbrowser1.Document as IHTMLDocument2).cookie;

 

Ver: TFixedFileInfo;
begin
Ver := FileInfo(Application.ExeName);
Edition.Caption := ‘软件版本:‘ + IntToStr(Ver.wFileVersionLS) + ‘.‘ +
      IntToStr(Ver.wFileVersionMS) + ‘.‘ +
      IntToStr(Ver.wProductVersionLS) + ‘.‘ +
      IntToStr(Ver.wProductVersionMS) + ‘ - [正式版]‘;
end;

这样,明白了吗?
---------------------------------------------- 
有空来俺们的小站逛逛(技术分享http://www.e8e.net)

 

作者:
技术分享 star5 (星五) ▲▲▲▲△ -
盒子活跃会员
2008-12-25 18:41:32
2楼: 其他,如文件大小什么什么的,自己搜索下。
---------------------------------------------- 

 

SOS!关于Record初始值一个问题! 浏览:1247
加入我的收藏
楼主: 我有个结构是这样子的
  TConfig = record
      A: Boolean;
      B: Integer;
      C: Boolean;
      D: Integer;
      //以此类推  非常多,下面还有数组
   sName: array[0..8] of string;
   boUse: array[0..8] of Boolean;
   wNum:  array[0..8] of Word;
  end;

var
  Config: TConfig = (
      A: False;
      B: 0;
      C: True;
      D: 2;
      //以此类推  非常多,下面还有数组
   sName:(‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘);
   boUse:(False, True, False, False, True, False, True, False, False); 
   wNum: (0, 1, 0, 4, 0, 3, 0, 0, 0);
   );



当定义时,初始了,在程序运行中,需要初始成定义时的数据,只能一个个赋值吗?还是有其它办法吗?
---------------------------------------------- 
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
 
作者:
技术分享 wr960204 (武稀松) ▲▲▲▲▲ -
盒子活跃会员
2010-12-15 21:31:49
1楼: 全局变量或Const定义的常量可以给初始值
---------------------------------------------- 
武稀松技术分享http://www.raysoftware.cn
作者:
技术分享 wqyfavor (wqyfavor) ▲▲▲▲△ -
普通会员
2010-12-15 21:44:32
2楼: 不懂得你说的在程序中初始是什么意思。应该是你想说在程序运行时为整个Record赋值吧,那直接 := 就可以了。
---------------------------------------------- 
技术分享http://hi.baidu.com/wqyfavor
作者:
技术分享 q34625474 (q34625474) ▲▲▲▲△ -
盒子活跃会员
2010-12-15 21:48:10
3楼: TO wqyfavor 

在程序运行的时候 用户可以修改 结构中的类型数据    用户还可以执行恢复默认设置,  当他恢复默认设置的时候 能否将这个结构初始化成    结构定义那里的值     只能一个一个的赋予给结构中的成员吗?
---------------------------------------------- 
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
技术分享 supermay (supermay) ▲▲▲▲▲ -
盒子活跃会员
2010-12-15 22:35:16
4楼: 没有办法
统一值的话,你可以用fillchar
---------------------------------------------- 
卖源码技术分享http://item.taobao.com/item.htm?spm=686.1000925.1000774.16.gmrHsT&id=37407600038每天点一下广告,支持盒子不关闭技术分享
作者:
技术分享 wqyfavor (wqyfavor) ▲▲▲▲△ -
普通会员
2010-12-15 23:17:55
5楼: 恢复成定义那里的值,你可以把那个定义改成const啊,就是一个常量。然后赋值给你的变量就可以了啊。
---------------------------------------------- 
技术分享http://hi.baidu.com/wqyfavor
作者:
技术分享 q34625474 (q34625474) ▲▲▲▲△ -
盒子活跃会员
2010-12-16 2:32:19
6楼: to wqyfavor  
你还是不懂得我的意识
结构内非常多  如果一个一个赋值  会很麻烦  我想整个RECORD初始值
---------------------------------------------- 
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
技术分享 wr960204 (武稀松) ▲▲▲▲▲ -
盒子活跃会员
2010-12-16 9:29:30
7楼: 都告诉你了.
全局变量或Const定义的常量可以给初始值.
你先定义一个全局变量或常量.
当想赋初始值的时候就等于这个变量或常量不就得了.
---------------------------------------------- 
武稀松技术分享http://www.raysoftware.cn
作者:
技术分享 adamwu (AdamWu) ▲▲▲△△ -
注册会员
2010-12-16 10:38:44
8楼: 不知道string, interface等能不能自动处理。
不过如果有动态数组或者对象引用那肯定是不能直接等于的。
---------------------------------------------- 
-
作者:
技术分享 lbq971101 (lbq971101) ▲▲▲▲▲ -
盒子活跃会员
2010-12-17 18:42:21
9楼: 用CopyMemory就可以了,不用一个一个赋值
---------------------------------------------- 
兼金软件工作室
作者:
技术分享 egust (欢迎访问 Delphi@smth.org) ▲▲▲▲△ -
普通会员
2010-12-17 19:02:27
10楼: 像 lz 给出来的 record(成员包括自动管理生存期的 string 类型),CopyMemory/Move 属于找死的行为,必须要用“:=”标准赋值语句,或者自己调 system._CopyRecord 才行(后者还很麻烦)。FillChar/ZeroMemory 除非在还没使用过该局部变量的时候用,否则只要任何一个 string 里有指向非常量的内容,就会产生内存泄露。
---------------------------------------------- 
cnblogs中我写的关于Delphi的blog,欢迎访问:
技术分享http://www.cnblogs.com/egust/

 

作者:
技术分享 bmsr (白忙剩人) ▲▲▲▲△ -
普通会员
2010-12-17 19:24:29
11楼: 给你个例子自己去看
  RecBskyCust = record
    Ver: integer;
    Cust_ID: integer;
    Cust_name: string[40];
    Cust_NiName: string[40];
    Email: shortstring;
    MPhone: string[80];
    Phone: string[80];
    SFZ: string[18];
    pass: string[40];
    Func: integer;
    Reg_Time: TDateTime;
    UpDate_Time: TDateTime;
    QQ: integer;
    Msn: shortstring;
    OtherIM: shortstring;
    Company: shortstring;
    Area_Code: integer;
    PostCode: integer;
    Address: shortstring;
    CUST_STATES: TPassStates;
    Descr: string;
  end;

function CopyRecord(Rs: RecBskyCust; var RD: RecBskyCust): boolean; overload;
begin
  Result := False;
  try
    DisposeRecord(RD);
    System.move(Rs, RD, sizeof(Rs) - sizeof(string));
    RD.Descr := Rs.Descr;
    Result := True;
  except
    on E: Exception do
      Application.MessageBox(PChar(E.Message + ‘错误号:‘ + IntToStr(E.HelpContext)), ‘错误!‘, MB_OK + MB_ICONERROR + MB_TOPMOST);
  end;

end;

function DisposeRecord(Var R: RecBskyCust): boolean;
begin
  Result := False;
  try
    R.Descr := ‘‘;
    zeromemory(@R, sizeof(R));
    Result := True;
  except
    on E: Exception do
      Application.MessageBox(PChar(E.Message + ‘错误号:‘ + IntToStr(E.HelpContext)), ‘错误!‘, MB_OK + MB_ICONERROR + MB_TOPMOST);
  end;
end;
除了string 类型  还有动态数组和其它指针类型也需要单独处理,所以尽量把这类数据类型放到record的最后

 

 

网上有这种代码了,只是因为写的较早,有些地方写的不那么言简意赅,而且在XE后的版本中有问题(因为Unicode字符的关系)

下面是精简修改过的代码,只取第一块硬盘的序列号,Win7 + XE 测试通过。需要先安装JwApi函数库,因为有些结构体在库中有声明了

 

[delphi] view plaincopy技术分享技术分享
 
  1. unit uGetHDSN;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, JwaWinIoctl;  
  7.   
  8. function GetIdeSerialNumber: AnsiString;  
  9.   
  10. implementation  
  11.   
  12. type  
  13.   
  14.   TIdSector = packed record  
  15.     wGenConfig: USHORT;  
  16.     wNumCyls: USHORT;  
  17.     wReserved: USHORT;  
  18.     wNumHeads: USHORT;  
  19.     wBytesPerTrack: USHORT;  
  20.     wBytesPerSector: USHORT;  
  21.     wSectorsPerTrack: USHORT;  
  22.     wVendorUnique: array [0 .. 2] of USHORT;  
  23.     sSerialNumber: array [0 .. 19] of AnsiChar;  
  24.     wBufferType: USHORT;  
  25.     wBufferSize: USHORT;  
  26.     wECCSize: USHORT;  
  27.     sFirmwareRev: array [0 .. 7] of AnsiChar;  
  28.     sModelNumber: array [0 .. 39] of AnsiChar;  
  29.     wMoreVendorUnique: USHORT;  
  30.     wDoubleWordIO: USHORT;  
  31.     wCapabilities: USHORT;  
  32.     wReserved1: USHORT;  
  33.     wPIOTiming: USHORT;  
  34.     wDMATiming: USHORT;  
  35.     wBS: USHORT;  
  36.     wNumCurrentCyls: USHORT;  
  37.     wNumCurrentHeads: USHORT;  
  38.     wNumCurrentSectorsPerTrack: USHORT;  
  39.     ulCurrentSectorCapacity: ULONG;  
  40.     wMultSectorStuff: USHORT;  
  41.     ulTotalAddressableSectors: ULONG;  
  42.     wSingleWordDMA: USHORT;  
  43.     wMultiWordDMA: USHORT;  
  44.     bReserved: array [0 .. 127] of Byte;  
  45.   end;  
  46.   
  47.   PIdSector = ^TIdSector;  
  48.   
  49. const  
  50.   IDE_ATA_IDENTIFY = $EC;  
  51.   
  52. function LittleToBig(Data: Word): Word;  
  53. asm  
  54.   xchg ah, al  
  55. end;  
  56.   
  57. function GetIdeSerialNumber: AnsiString;  
  58. var  
  59.   hDevice: THandle;  
  60.   Size, cbBytesReturned: DWORD;  
  61.   SCIP: TSendCmdInParams;  
  62.   SCOP: PSendCmdOutParams;  
  63.   P: PWORD;  
  64.   I: Integer;  
  65. begin  
  66.   Result := ‘‘;  
  67.   
  68.   hDevice := CreateFile(‘\\.\PhysicalDrive0‘, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or  
  69.     FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);  
  70.   
  71.   if hDevice = INVALID_HANDLE_VALUE then  
  72.     Exit;  
  73.   
  74.   Size := SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1;  
  75.   SCOP := AllocMem(Size);  
  76.   
  77.   SCIP.irDriveRegs.bCommandReg := IDE_ATA_IDENTIFY;  
  78.   
  79.   if DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, @SCIP, SizeOf(TSendCmdInParams) - 1, SCOP, Size,  
  80.     cbBytesReturned, nil) = False then  
  81.   begin  
  82.     FreeMem(SCOP);  
  83.     CloseHandle(hDevice);  
  84.     Exit;  
  85.   end;  
  86.   
  87.   // 处理一下序列号在内存中的顺序  
  88.   with PIdSector(@SCOP^.bBuffer[0])^ do  
  89.   begin  
  90.     SetLength(Result, Length(sSerialNumber));  
  91.     P := @Result[1];  
  92.     CopyMemory(P, @sSerialNumber[0], Length(sSerialNumber));  
  93.     for I := to Length(sSerialNumber) div do  
  94.     begin  
  95.       P^ := LittleToBig(P^);  
  96.       Inc(P);  
  97.     end;  
  98.   end;  
  99.   FreeMem(SCOP);  
  100. end;  
  101.   
  102. end.  

 

 

盒子 收藏帖子 转移-实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录

标签:

原文地址:http://www.cnblogs.com/CodeGear/p/4290929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!