飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6391|回复: 17

非会员进行QQ表情编辑的代码

[复制链接]
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-5-4 19:38:58 | 显示全部楼层 |阅读模式
    好象Delphi版现在是越来越少的人气了啊!想个法子来提升一下人气撒!斑竹。从我开始第一贴!
      最新版的QQ出来了一个新的特性,就是可以编辑QQ表情,向其中添加一些自己要说的话语。
    但是这个特性好象需要开通会员吧!想想腾讯的策划部到是会抓商机呢。下面我将说说怎样使用非会员来使用QQ表情的编辑工具呢。
      我们打开QQ表情编辑的那个对话框,可以看出,他根本不会触发任何的网络的消息出去! 只是在最开始打开的时候会判断一下当前
    用户是否为会员,如果不是的话,那么很多项目则不可用,我们可以很轻易的想到一个API函数EnableWindow函数可以解除那些Enable
    为false的控件(只要知道他的消息句柄则可)。现在我们先假定一下,QQ表情编辑在编辑好了之后,用户点完成不会向腾讯服务器发送
    询问的(想想他应该不会抠门到这个程度吧!搞个编辑也要发个会员验证),先用Spy++一下,可以轻易的找到那些Enable为false的消息句柄,那么现在就好办了,直接使用enableWindow(Handle),看一下则解除禁止了。很简单。然后测试一下效果,果然可以。呵呵。那么我们只用写个代码来找句柄,然后在Enable他,则完了。
    {代码中使用了Raize控件包,如果有兴趣的话,自己写一个HOOK挂到QQ进程,这样就不用每次打开都去点一下解除禁止了。}
    代码如下:
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, RzCommon,RzLabel, RzButton, ExtCtrls, RzPanel;

    Const
      WM_DESTROYPN = WM_USER + 100;

    type
      TRzPanel = Class(RzPanel.TRzPanel)
      protected
        Procedure WndProc(Var Msg: TMessage);override;
      public
        Constructor Create(AOwner: TComponent);override;
      end;
      TForm1 = class(TForm)
        RzLabel1: TRzLabel;
        btn1: TRzButton;
        procedure btn1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        BegPos: TPoint;
        EdtHandle: THandle;
        Pn: TRzPanel;
        procedure DestroyPn(Var Msg: TMessage);message WM_DESTROYPN;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation
    var
      HsFree: Boolean=false;
      HsJieChu: boolean=false;
    {$R *.dfm}

    procedure SetControlOwner(Component: TComponent;NewOwner: TComponent);
    var
      tempOwner: ^integer;
    begin
       tempOwner := @(integer(Component.Owner));
       tempOwner^ := integer(NewOwner);
    end;

    procedure EnabledQQEdit;
      procedure BlHandle(ParentHandle: THandle);
      var
        backHwnd,tempHwnd:hWnd;
      begin
        backHwnd:=Getwindow(ParentHandle,GW_CHILD);
        while backHwnd<>0 do
        begin
          EnableWindow(backHwnd,true);
          tempHwnd := backHwnd;
          BlHandle(tempHwnd);
          backhwnd:=Getwindow(backhwnd,GW_HWNDNEXT);
        end;
      end;
    var
      FrmHandle: THandle;
    begin
      FrmHandle := FindWindow('#32770','编辑涂鸦表情');
      if FrmHandle <> 0 then
      begin
        SendMessage(FrmHandle,wm_settext,0,integer(Pchar('不得闲QQ表情编辑解禁!作者:不得闲!QQ: 75492895')));
        Application.MessageBox('QQ表情编辑工具解除禁止成功!','消息',64);
        SetForegroundWindow(FrmHandle);
        BlHandle(FrmHandle);
      end
      else
        Application.MessageBox('您没有打开QQ表情编辑工具!','消息',64);
    end;

    procedure EnabledQQEdit1;
    var
      FrmHandle,ModHandle: THandle;
      rec: TRect;
      Pn: TRzPanel;
      OldWidth: integer;
      procedure BlHandle(ParentHandle: THandle);
      var
        backHwnd,tempHwnd:hWnd;
      begin
        backHwnd:=Getwindow(ParentHandle,GW_CHILD);
        while backHwnd<>0 do
        begin
          EnableWindow(backHwnd,true);
          tempHwnd := backHwnd;
          BlHandle(tempHwnd);
          backhwnd:=Getwindow(backhwnd,GW_HWNDNEXT);
        end;
      end;
    begin
      FrmHandle := FindWindow('#32770','编辑涂鸦表情');
      if (FrmHandle <> 0) and (not HsJieChu) then
      begin
        SendMessage(FrmHandle,wm_settext,0,integer(Pchar('不得闲QQ表情编辑解禁!作者:不得闲!QQ: 75492895')));
        Form1.EdtHandle := FrmHandle;
        GetWindowRect(FrmHandle,Rec);
        Form1.BegPos.X := Rec.Right - Rec.Left;
        Form1.BegPos.Y := Rec.Bottom - Rec.Top;
        OldWidth := Rec.Right - Rec.Left + 2;
        SetWindowPos(FrmHandle,0,0,0,48 + OldWidth,rec.Bottom - rec.Top,6);
        Pn := TRzPanel.Create(nil);
        HsFree := false;
        Pn.Parent := Form1;
        Form1.Pn := Pn;
        Pn.Top :=  25;
        SetParent(Pn.Handle,FrmHandle);
        SetControlOwner(Pn,Pn.Parent);
        FrmHandle := FindWindowEx(FrmHandle,0,'#32770','');
        if FrmHandle <> 0 then
        begin
          GetWindowRect(FrmHandle,Rec);
          Pn.Left := OldWidth - 10;
          Pn.Height := rec.Bottom - rec.Top - 34;
          Pn.Width := 55;
          SetWindowPos(FrmHandle,0,0,0,OldWidth-2,rec.Bottom - rec.Top,6);

          ModHandle := FindWindowEx(FrmHandle,0,'Edit','');
          if ModHandle <> 0 then
            EnableWindow(ModHandle,true);

          ModHandle := FindWindowEx(FrmHandle,0,'Static','');
          if ModHandle <> 0 then
            EnableWindow(ModHandle,True);
          ModHandle := FindWindowEx(FrmHandle,0,'Button','完成');
          if ModHandle <> 0 then
            EnableWindow(ModHandle,true);
          ModHandle := FindWindowEx(FrmHandle,0,'Static','您还不是会员,开通QQ会员即可使用');
          if ModHandle <> 0 then
            SetWindowText(ModHandle,'不得闲QQ表情编辑解禁工具1.0');
          Application.MessageBox('QQ表情编辑工具解除禁止成功!','消息',64);
          SetForegroundWindow(FrmHandle);
          HsJieChu := true;
        end;
      end;
    end;


    procedure TForm1.btn1Click(Sender: TObject);
    begin
      EnabledQQEdit1
    end;

    procedure TForm1.DestroyPn(var Msg: TMessage);
    begin
      pn := TRzPanel(Msg.WParam);
      if not HsFree then
      begin
        HsFree := true;
        HsJieChu := false;
        FreeAndNil(pn);
      end;
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if not HsFree then
      begin
        HsFree := true;
        Pn.Free;
        SetWindowPos(EdtHandle,0,0,0,BegPos.X,BegPos.Y,6);
      end;
    end;

    { TRzPanel }

    constructor TRzPanel.Create(AOwner: TComponent);
    var
      Rz1,Rz2: TRzLabel;
    begin
      inherited Create(AOwner);
      HsFree := false;
      Rz1 := TRzLabel.Create(self);
      Rz1.Parent := self;
      Rz1.Caption :='欢'#13#10'迎'#13#10'使'#13#10'用'#13#10'QQ'#13#10'表'#13#10'情'#13#10'编'#13#10'辑'#13#10'禁'#13#10'止'#13#10'解'#13#10'除'#13#10'工'#13#10'具'#13#10'V1';
      Rz1.Align := AlTOp;
      Rz1.AutoSize := false;
      Rz1.Alignment := taCenter;
      Rz1.TextStyle := tsRaised;
      Rz1.Height := 196;
      Rz1.Font.Name := '宋体';
      Rz1.Font.Charset := GB2312_CHARSET;
      Rz1.Font.Size := 9;
      Rz1.Transparent := true;
      Rz1.Font.Color := clMaroon;
      Rz1.Font.Style := [fsbold];

      Width := 57;
      Rz2 := TRzLabel.Create(self);
      Rz2.Parent := self;
      Rz2.Align := AlBottom;
      Rz2.AutoSize := false;
      Rz2.Caption := '作者:'#13#10' 不得闲'#13#10'QQ:'#13#10'75492895';
      Rz2.Height := 57;
      Rz2.Font.Assign(Rz1.Font);
      Rz2.TextStyle := tsRaised;
      Rz2.Transparent := true;
      VisualStyle := vsGradient;
      GradientColorStyle := gcsCustom;
      GradientColorStart := $00FFAA55;
      GradientColorStop := $00FFAA55;
      BorderOuter := fsNone;
    end;

    procedure TRzPanel.WndProc(var Msg: TMessage);
    begin
      if Msg.Msg = WM_DESTROY then
        SendMessage(Form1.Handle,WM_DESTROYPN,integer(self),0);
      Inherited
    end;

    end.

    [ 本帖最后由 suiyunonghen 于 2008-5-4 19:40 编辑 ]

    QQ表情编辑解除禁止.rar

    73.37 KB, 下载次数: 40, 下载积分: 飘云币 -2 枚

    由于只能上传270K以下的,所以去了Exe

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-7-21 14:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-5-10 00:13:33 | 显示全部楼层
    学习了!

    不知是那个版本的Delphi开发的!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-10 01:01:44 | 显示全部楼层
    我的QQ个个是太阳...好像不有限制~
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-5-19 16:29:53 | 显示全部楼层
    顶中国一下,这段时候一直在关注着震灾方面的,没上来了。
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-5-19 16:30:31 | 显示全部楼层
    原帖由 Luckly 于 2008-5-10 01:01 发表
    我的QQ个个是太阳...好像不有限制~


    你不受限制吗?是会员吧!
    我都快两个太阳了,还不能用哦
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-5-19 16:31:02 | 显示全部楼层
    原帖由 topzhp 于 2008-5-10 00:13 发表
    学习了!

    不知是那个版本的Delphi开发的!



    D7版本的
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-20 09:55:46 | 显示全部楼层
    原帖由 suiyunonghen 于 2008-5-19 16:30 发表


    你不受限制吗?是会员吧!
    我都快两个太阳了,还不能用哦


    呵呵.,..这个我不知道,我用的是本地会员版QQ
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-21 11:28:06 | 显示全部楼层
    我的代码更简单
    .版本 2

    .子程序 _按钮1_被单击
    .局部变量 hwnd, 整数型
    .局部变量 edithwnd, 整数型
    .局部变量 btn, 整数型
    .局部变量 static, 整数型

    hwnd = FindWindowA (“#32770”, “编辑涂鸦表情”)
    .如果真 (hwnd = 0)
        信息框 (“请先打开编辑涂鸦表情窗口”, #警告图标, “提示”)
        返回 ()
    .如果真结束
    hwnd = FindWindowExA (hwnd, 0, “#32770”, “”)
    edithwnd = FindWindowExA (hwnd, 0, “Edit”, “”)
    .如果真 (edithwnd ≠ 0)
        EnableWindow (edithwnd, 真)
        btn = FindWindowExA (hwnd, 0, “Button”, “完成”)
        EnableWindow (btn, 真)
        static = FindWindowExA (hwnd, 0, “Static”, “”)
        EnableWindow (static, 真)
    .如果真结束

    [ 本帖最后由 Luckly 于 2008-5-21 11:31 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-5-22 19:38:49 | 显示全部楼层
    你的代码自然更简单,你直接用Spy++来查找句柄,然后直接定位,自然简单!
    我的那个是通过主窗体,然后一级递归遍力下来之后,让所有的都变成可用,而非是仅仅针对那个按扭而已了
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-5-22 19:40:38 | 显示全部楼层
    而且我向其中添加了一些作者信息而已。呵呵,其实代码是很简单的。不过是弄了一些没必要的东西进去。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表