你曾为公司不让用QQ MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了
当初公司做校园一卡通的项目时 里面的机房客户端需要用到系统的低级键盘钩子WH_KEYBOARD_LL 这也是我第一次接触到Windows中的Hook 因为WH_KEYBOARD_LL和其他钩子不一样 在Delphi的Windows帮助以及windows pas文件中都没有定义 但microsoft的msdn中确有WH_KEYBOARD_LL的介绍 所以一路解决后就对Windows的系统钩子产生了兴趣 之后相继做过鼠标钩子WH_MOUSE 低级鼠标钩子WH_MOUSE_LL以及消息钩子WH_GETMESSAGE的小例子 都很有意思
这次我用到的是另外一个系统钩子 WH_CBT
看了delphi中的帮助 发现CBTProc中有很多功能
HCBT_ACTIVATEHCBT_CREATEWNDHCBT_DESTROYWNDHCBT_MINMAXHCBT_MOVESIZEHCBT_SETFOCUSHCBT_SYSMAND
(具体就不介绍了 看看帮助里写的很清楚)
随后便开始试验起来 最终完成了这个小程序 下面我简单介绍一下
运行程序后自动隐藏 当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的 与XX聊天 的标题没有了 而标题换成了 我的文档 这时如果你再将此聊天窗口的图标换成文档样式的图标 那么谁还能看出那就是你的聊天窗口呢?(更换图标的方法也很多 可以用程序 也可以用软件直接修改QQ的资源文件 这部分我没有做 这里只是提供大家一个思路 有兴趣的朋友可以自己尝试一下 呵呵)
下面将代码帖出
library HookPrj;
uses SysUtilsClassesQQTitleHook in QQTitleHook pas ;
exportsEnableWheelHook DisableWheelHook;
begin QQChat:= ;end unit QQTitleHook;
interface
uses Windows Messages SysUtils Dialogs CommCtrl StrUtils;
var QQChat: HHOOK; //聊天窗口的句柄 hwQQChat: HWnd ; //聊天窗口的标题 tlQQChat: string; //窗口类名 clsName: string; buf: array [ ] of char;
const//QQ聊天窗口的类名csQQ = # ;
function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall; function EnableWheelHook : Boolean; stdcall; export; function DisableWheelHook: Boolean; stdcall; export;
implementation//钩子的处理函数 function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; beginResult:= ;if Code< thenbegin Result:= CallNextHookEx(QQChat Code wParam lParam); Exit;endelse if Code = HCBT_ACTIVATE then begin//获取激活窗口的句柄 以及窗口类名 然后判断此窗口类名是否为# hwQQChat:= HWND(wParam);GetClassName(hwQQChat buf );clsName:= string(buf);if clsName = csQQ thenbegin //如果窗口类名是# 则遍枚举所有窗口 并将窗口句柄传入//这里仅仅做演示用 因为Windows中很多窗口的类名均为# 所以这样判断效率会很低//有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件 从而提高效率EnumWindows(@EnumWindowsTitleFunc hwQQChat);end; end;end;
function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall; beginif (Handle = lParam) and boolean(GetWindowText(Handle buf )) thenbegin //根据窗口句柄获得窗口标题 tlQQChat:= string(buf); //然后判断标题中是否包含 与 聊天 等相关字符 如果包括则此窗口为QQ聊天窗口 if ((pos( 与 tlQQChat)> ) and (pos( 聊天中 tlQQChat)> )) then begin//确定为聊天窗口后遍修改窗口标题 tlQQChat := AnsiReplaceStr(tlQQChat 与 我的文档 );tlQQChat := AnsiReplaceStr(tlQQChat 聊天中 );SetWindowText(Handle pchar(tlQQChat)); end; //同上 这个地方大家可以自由控制 不仅仅局限在QQ MSN等聊天窗口//且想要将标题改成什么也可以自由控制 如果能根据修改后的窗口图标来确定标题 //比如通过修改将窗口图标替换成Delphi的图标 然后标题修改为Delphi 谁还能看出破绽呢?哈哈 if ((pos( 群 - tlQQChat)> ) or (pos( 高级群 - tlQQChat)> )) then begintlQQChat := AnsiReplaceStr(tlQQChat 群 - 我的文档 );tlQQChat := AnsiReplaceStr(tlQQChat 高级 );SetWindowText(Handle pchar(tlQQChat)); end; //MSN if pos( 对话 tlQQChat)> then begintlQQChat := AnsiReplaceStr(tlQQChat 对话 我的文档 );SetWindowText(Handle pchar(tlQQChat)); end;end;Result :=True; end;
//启动钩子 function EnableWheelHook: Boolean; stdcall; export; beginif QQChat= thenbegin QQChat := SetWindowsHookEx(WH_CBT @TitleHookProc Hinstance ); Result := True;endelse Result := False;end;
//卸载钩子function DisableWheelHook: Boolean; stdcall; export;begin if QQChat<> then beginUnHookWindowsHookEx(QQChat);QQChat := ;Result := True; end elseResult := False; end;
end
调用的应用程序就很简单了 调用EnableWheelHook后隐藏就可以了 退出时DisableWheelHook就OK啦
lishixinzhi/Article/program/Delphi/201311/24742
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
从网上下了一个别人用delphi70和Access做的宿舍管理系统,有一小部分和我所需要的不符,所以想改一下,就是改一下界面和后台数据库之类的,总的应用程序不改,请高手指教
还有就是delphi70怎么样生成一个可直接执行的文件
谢谢
解析:
你有装delphi吗如果有的话:
双击文件夹下的一个dpr类型图标,打开后就能看见源代码了
你需要修改界面之类的都需要这样做后台数据库也需要在程序的编辑状态下进行,找到数据库连接控件,从新设置连接的数据库
直接使用F9运行就可以生成可执行文件
补充:
你修改了之后,应该没有运行吧
如果运行了之后还是那有那就有问题了
修改了之后需要在编辑状态下重新运行程序,这样才能更新可执行文件或者你把原来的可执行文件删了,重新运行程序(注;是在delphi下运行程序)
写入注册表,当程序加载的时候再读取注册表即可
第二种就是生成一个ini配置文件,将当前程序的相关配置保存,当程序运行之初的时候读取~
简单点说以上两种方法就是把你的Button的Caption属性值保存进一个文件内,程序第二次运行的时候再读出来~~~
相关代码百度上太多了,这里就不赘述了。
1、工程的名字要在菜单:Project-Options-Application-Title里面设置,工程中的窗体是不会显示在任务栏上的,因为它们是属于Test这个工程的,就只会显示Test这个工程的标题。
2、不用生成多个工程,就可以实际多个窗体分别显示在任务栏上,像Word一样:
标题 : 在任务栏上实现像WORD XP一样的多窗口
关键字: 多窗口,任务栏
分类 : 开发技巧
密级 : 公开
(评分: , 回复: 1, 阅读: 301) »»
我们有时候要让每一个窗口在任务栏上有一个按钮,但不方便的是,DELPHI为我们做得太多,
甚至有些过份了点,呵,还好有办法解决
首先,看VCL源码
procedure TCustomFormWMSysCommand(var Message: TWMSysCommand);
begin
with Message do
begin
if (CmdType and $FFF0 = SC_MINIMIZE) and (ApplicationMainForm = Self) then
ApplicationWndProc(TMessage(Message))
else if (CmdType and $FFF0 <> SC_MOVE) or (csDesigning in ComponentState) or
(Align = alNone) or (WindowState = wsMinimized) then
inherited;
if ((CmdType and $FFF0 = SC_MINIMIZE) or (CmdType and $FFF0 = SC_RESTORE)) and
not (csDesigning in ComponentState) and (Align <> alNone) then
RequestAlign;
end;
end;
可以得知,MainForm的一些消息被传给了应用程序对象Application,我们要做的就是截取这
些消息,干我们自己想干的
1在主窗体unit中
声明
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
procedure CreateParams(var Params:TCreateParams); override;
实现
procedure TForm1WMSysCommand(var Message: TWMSysCommand);
begin
case messageCmdType of
SC_MAXIMIZE,SC_MINIMIZE,SC_RESTORE: //这几个消息自己处理
DefWindowProc(SelfHandle,messageMsg,messageCmdType,0)
else
inherited; //交给DELPHI
end;
end;
procedure TForm1CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
ParamsExStyle := ParamsExStyle or WS_EX_APPWINDOW ;//让主窗体出现在任务栏上
end;
好了,这样主窗体就会出现在任务栏上,而且最小化也不会消失,现在要做的就是
让Application在任务栏上的按钮消失,用以下代码
procedure TForm1FormShow(Sender: TObject);
begin
showwindow(ApplicationHandle ,sw_hide);
end;
其它的窗体想出现在任务栏,只要像主窗体一样重载CreateParams方法,并用相同的代码,
因为是非MainForm,所以不用截取那几个消息
这样就实现了一个应用程序有多个任务栏按钮,而且不会相互影响
以上就是关于Delphi中利用钩子实现QQ聊天窗口的修改全部的内容,包括:Delphi中利用钩子实现QQ聊天窗口的修改、如何修改别人的delphi程序、Delphi作的程序运行时修改button按钮名称,如何使下次开启程序时显示修改后的名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)