呵呵,不行,我测试过的!
insertmenu(getsystemmenu(handle,false),0,MF_BYPOSITION+MF_STRING,0,'test');
sysmenu跟任务栏的菜单不一样!
insertmenu(getsystemmenu(handle,false),0,MF_BYPOSITION+MF_STRING,0,'test');
sysmenu跟任务栏的菜单不一样!
调试欢乐多
InsertMenu(GetSystemMenu(Application.Handle, False), 0, MF_BYPOSITION + MF_STRING, 0, 'test');
10'。
OK,明白你的意思!但是鼠标在任务栏的消息是什么?重载wndproc之后应该处理那个消息?!例如左键单击?以后一起给分!
var Handled: Boolean);
begin
if (Msg.Message = WM_SYSCOMMAND)
and (WParam = MF_BYPOSITION + MF_STRING)
and (hWnd = Application.Handle) then
begin
// TODO: Add your message handler code here and/or call default
Handled := True;
end;
end;
WM_NCLBUTTONDBLCLK
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMOUSEMOVE
WM_NCRBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
Application是一个全局变量,有的消息是不会发给主窗体FORM的,如果想处理的话,需要一个写一个方法,然后将application的onmessage指向这个方法指针就可以了。
比如
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure FilterMessage(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FilterMessage(var Msg: TMsg; var Handled: Boolean);
begin
If (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = SC_MINIMIZE) then
begin
ShowMessage('SC_MINIMIZE');
Handled := true;
end
else
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := FILTERMessage;
end;end.
WM_NCCLACSIZE
WM_NCACTIVE
WM_NCDESTROY
2 goodhope:
OICQ是用Borland的工具写的吗?
在TApplication.CreateHandle中有如下代码:
SysMenu := GetSystemMenu(FHandle, False);
DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);
去掉就可以了
将DelphiX\Lib目录下的Forms.dcu改名为OriginForms.dcu。 打开DelphiX\Source\VCL目录下的Forms.pas屏蔽掉TApplication.CreateHandle中如下代码:
SysMenu := GetSystemMenu(FHandle, False);
DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND); 选择菜单Project->Build 你的工程即可(请先保存工程,因为有时Build后会兰屏,主要是因为装了一些构件。重运行Delphi即可)。 最后,选择菜单Project->Options。去掉刚才在Dicectorise/Conditionals页中Search path中添加的[$DELPHI]\Source\VCL这一项。
将DelphiX\Source\VCL目录下的Forms.dcu 复制到DelphiX\Lib目录。再删除DelphiX\Source\VCL目录下其它无用了的*.dcu文件。
用SPY拦时,查看WM_USER+0x???.
2 mjian:
不会吧?你说的是系统栏内的图标吧?
我还要等一等,还有谁要说什么吗?
2 goodhope:
以后一起给分!
如果是别人的程序,你只好用Hook技术来实现了,VC5中有Hook的例子,把它移植到delphi下即可拦截你想要捕获的鼠标消息。
你说的那是时钟旁边的图标吧,那个我知道!如果不是,请给出例程!谢谢!