注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
从Melissa到Zotob:Windows蠕虫1
病毒常识: DLL 木马揭秘
应对DoS/DDoS攻击的十条军规
从后台得到webshell技巧大汇总
DNS 系统设定例--7.[Fwd] 特殊网
DNS 系统设定例--11.[Fwd] 特殊网
DNS 系统设定例--12.[Fwd;正解] 
DNS 系统设定例--13.[Fwd] NCTU 
DNS 系统设定例--16.[Fwd] 特殊网
DNS 系统设定例--17.[Rev-CIDRD]
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> Delphi >> 文章正文
[Delphi版]罗技无限灵貂,驱动程序补丁-实现真正的多媒体播放器!附QQ图标伪装程序
作者:ACDSeeQ  来源:ACDSeeQ 的 Blog  点击:  更新:2006-12-19
简介:

[Delphi版]罗技无限灵貂,驱动程序补丁-实现真正的多媒体播放器!附QQ图标伪装程序
 
 
██████████ QQ图标伪装程序
 
    将 QQ 聊天窗口的标题栏中的 “与 某某 聊天” 变成 “我的文档 某某”,而且聊天窗口的图标变成 Word 文档的图标,托盘中的图标在不同状态时也变成其它图标:例如在线=网络驱动器、离开=软盘驱动器、隐身=硬盘驱动器、离线=断开网络驱动器。
 
    变图标不需要编程,修改 QQ2004 的 QQRes.Dll 文件即可。
 
 
██████████ 罗技无限灵貂,驱动程序补丁-实现真正的多媒体播放器
 
    罗技无限灵貂是罗技公司推出的一款多功能无线鼠标,英文名称叫做“Logitech Media Player”,顾名思义-多媒体遥控器。
 
    该款鼠标最大的特色就是嵌入了众多的功能键,除滚轮外,另有8个键。其中侧面的两个键在罗技众多的中高档鼠标都已配备,功能主要是上下浏览;顶部的六个键组成多媒体键区,包括:“Media、Play/Pause、Forward、Backward、+、-”。此外,滚轮可进行十字导航,即多了左右浏览功能。
 
    但在实际使用中,多媒体键的功能实在有限,以我的标准看来,根本发挥不了遥控器的作用!为什么这么说呢?
 
    我钟爱使用的媒体播放器是MPC(MS Windows Media Player Classic),它短小精悍、启动快、占资源少、快捷键丰富,用鼠标、键盘操作起来十分简单。
 
    下面针对 MPC 说说灵貂的缺憾:
    播放/暂停 点击左键或 Space 即可,左键就在鼠标上,因此 Play/Pause 键就多余了;
    下一个/上一个 点击 PgUp/PgDown 即可,虽然鼠标上对应的是 Forward/Backward,但我们在看一个电影或者视频片断的时候,有多少机会能在中途去看上一个或者下一个文件呢?即使针对超过10分钟的视频文件,看完一个,手工去点击下一个文件也不是很费事的工作么,因此这两个键也就多余了。
 
    罗技提供的最新驱动程序并未提供上述三个键的自定义功能,因此为了充分地利用上鼠标上的众多功能键,我只好在 QQ 图标程序中加入了新的代码来实现这三个键的自定义功能,并且还可以在不同的应用程序中令同一个鼠标键实现不同的自定义功能。
 
    利用官方的驱动设置程序设置:
    Media 键的功能为组合键:Ctrl+F4,缩放的功能为关闭程序(效率十分高)。
 
    之后的程序可以实现如下功能(主要是组合键):
 
    ◎MPC
    向上浏览:前进10秒;向下浏览:倒退10秒。
    ◎ACDSee
    Play/Pause:Ctrl+Del;Forward:Alt+C;Backward:Alt+M。
    ◎ACD FotoCanvas
    Play/Pause:Ctrl+S;Forward:Shift+A;Backward:Shift+S。
    ◎NetCaptor
    Play/Pause:Ctrl+Shift+S;Foward:F3;Backward:F2。
    ◎UltraEdit
    Play/Pause:Ctrl+S;Foward:Ctrl+Shift+F6;Backward:Ctrl+F6。
   
    最后我要鄙视一下罗技无限灵貂驱动程序的开发人员!
    鼠标驱动的核心功能在于对鼠标传来的位移信号的换算与处理,还有诸如各种按键的定义、加速度的处理等问题,但这些相对于移动信号的处理与分析来说只是小问题,在这一方面的程序编制并不存在功能上的技术困难。既然你们作出了那么多中高档的鼠标,尤其是我花了360人民币买的这款灵貂,为何不再多敲些代码,把多媒体键区的几个键也加入自定义功能。毕竟计算机不是电视、录音机、VCD机、DVD机、组合音响…,多媒体功能只是计算机的一部分功能,多数人还是要用它来做其它很多游泳的事情的,如果能在更多的应用软件中让每个键都实现自定义功能,那么以它目前不到400元的价格和为数众多的鼠标键,绝对是一款超值的鼠标!
 
 
██████████ Delphi 代码如下,其中只有MPC用到了钩子,因为在媒体播放软件中,多媒体键区的键及两个侧键产生的消息都被罗技的驱动钩子给拐跑了,所以要自己编个全局钩子提前把消息拦住,让罗技的钩子钩不到我需要的消息。
 
 
//▓▓▓▓▓▓▓▓▓ ReTitle.dpr
program ReTitle;

uses
  Forms,
  SysUtils,
  Windows,
  Unit1 in 'Unit1.pas' {f},
  DlgDebug_U in 'DlgDebug_U.pas' {dlgDebug};

{$R *.res}

begin
  Application.Initialize;

//调试状态
dbg := findCmdLineSwitch('debug', ['/', '-'], true);
if dbg then  with dlgDebug do begin
 dlgDebug := TDlgDebug.Create(Application);  Show;
 Left := GetSystemMetrics(SM_CXSCREEN)-Width ;
    Top  := GetSystemMetrics(SM_CYSCREEN)-Height-60;
end;

  Application.CreateForm(Tf, f);
  Application.Run;
end.
 
 
//▓▓▓▓▓▓▓▓▓ Unit1.pas
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DlgDebug_U;

type
  Tf = class(TForm)
    Tmr: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure TmrTimer(Sender: TObject);
    procedure WndProc(var Message: TMessage); override;
  private
    { Private declarations }
    hFocus: HWND;
    Buf: array[0..1024] of Char;
    sTitle: string;
    //QQ
    procedure GetMousePosHwndAndClassName(Sender : TPoint);
    function replacing(s,source,target:string):string;
    //罗技无限灵貂
    procedure Down(VK: byte);
    procedure UP  (VK: byte);
    procedure Key1(VK1          : byte);
    procedure Key2(VK1, VK2     : byte);
    procedure Key3(VK1, VK2, VK3: byte);
  public
    { Public declarations }
  end;

var
  f: Tf;

const
    LOGITECH   = $0319;
    PLAY_PAUSE = $E0000;
    PLAY_LEFT  = $C0000;
    PLAY_RIGHT = $B0000;

   
implementation
    procedure EnableWheelHook ; stdcall; external 'HookPrj.dll';
    procedure DisableWheelHook; stdcall; external 'HookPrj.dll';
{$R *.dfm}

procedure Tf.FormCreate(Sender: TObject);//█████████████ 界面初始化
begin
    FormStyle := fsStayOnTop;
    Height:=0;
    Width:=0;
    Hide;
   
    Tmr.Interval := 50;
   
    ShowWindow(Application.Handle, SW_HIDE);
    SetWindowLong(Application.Handle, GWL_EXSTYLE,
        GetWindowLong(Application.handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);

    EnableWheelHook;//罗技灵貂蓝色侧键,WM_MouseWheel 消息钩子
end;

procedure Tf.GetMousePosHwndAndClassName(Sender: TPoint);//███ 伪装标题栏
var hWnd: THandle;
    aTitle: array [0..255] of char;
    str:string;
begin
    hWnd := WindowFromPoint(Sender);

    if boolean(GetWindowText(hWnd, aTitle, 256)) then begin
        str :=  string(aTitle);

        //QQ
        if ((pos('与',str)>0) and (pos('聊天中',str)>0)) then begin
            str:=replacing(str, ' 聊天中', '');
            str:=replacing(str, '与', '我的文档');
            SetWindowText(hWnd,pchar(str));
        end;

        if ((pos('群 -',str)>0) or (pos('高级群 -',str)>0)) then begin
            str:=replacing(str, '群 -', '我的信件');
            str:=replacing(str, '高级', '');
            SetWindowText(hWnd,pchar(str));
        end;

        //聊天室
        if pos('QQ 聊天室', str)>0 then begin
            str := 'Microsoft Visual C++ 6.2';
            SetWindowText(hWnd,pchar(str));
        end;

        //MSN
        if pos(' - 对话', str)>0 then begin
            str := replacing(str, ' - 对话', '工作文档');
            SetWindowText(hWnd,pchar(str));
        end;
    end;
end;

procedure Tf.TmrTimer(Sender: TObject);//████████████▌定时器
var rPos: TPoint;
begin
    if boolean(GetCursorPos(rPos)) then GetMousePosHwndAndClassName(rPos);
end;

function Tf.replacing(s,source,target:string):string;//█████ 替换字符串
var site, strlen: integer;
begin
    site:=pos(source,s);
    strlen:=length(source);
    delete(s,site,strlen);
    insert(target,s,site);
    result:=s;
end;

procedure Tf.WndProc(var Message: TMessage);////███████▌罗技无限灵貂
begin with Message do begin
    inherited;

    //如果不是多媒体键区的中右侧三个键按下,则退出
    IF NOT(  (Msg=LOGITECH) and ((lParam=PLAY_PAUSE)or(lParam=PLAY_LEFT)or(lParam=PLAY_RIGHT))  ) THEN exit;

    hFocus := GetForegroundWindow;
    GetWindowText(hFocus, buf, 1024);
    sTitle := string(buf);
    deb(sTitle);

    //ACDSee
    if (pos('ACDSee', sTitle)>0) and (pos('5.0', sTitle)>0) and (Msg=LOGITECH) then case lParam of
        PLAY_PAUSE: Key2(VK_Control, VK_Delete);//Ctrl+Del
        PLAY_LEFT : Key2(VK_Menu   , ord('M') );//Alt+M
        PLAY_RIGHT: Key2(VK_Menu   , Ord('C') );//Alt+C
    end;

    if (pos('ACD', sTitle)>0) and (pos('FotoCanvas', sTitle)>0) and (Msg=LOGITECH) then case lParam of
        PLAY_PAUSE: Key2(VK_Control, ord('S'));//Ctrl+S
        PLAY_LEFT : Key2(VK_Shift  , ord('S'));//Shift+S
        PLAY_RIGHT: Key2(VK_Shift  , Ord('A'));//Shift+A
    end;

    //NetCaptor
    if (pos('NetCaptor', sTitle)>

[1] [2] [3] 下一页






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务