1 用COM通过Windows提供的IShellExtInit和IContextMenu接口(ShlObj单元),应该可以达到这个功能,具体怎么做没试过,<Delphi COM 深入编程>一书里面有关于这方面的内容.
2 用ICO就行了
3 可以用Sleep(xxx) 控制程序停止响应xxx毫秒
4 function ShutDown(uFlags: Cardinal):boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);var
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error:integer;
begin
error:=0;
// 设置特权
// Delphi2:
//if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, @Token) then
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error := Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid) then
Error := Error or 8;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len) then
Error:=Error or 16;
ExitWindowsEx(uFlags, 0);
Result := (Error=0);
end;调用:
ShutDown(EWX_POWEROFF + EWX_FORCE);//强制关机并无任何提示5 类似第一个问题
2 用ICO就行了
3 可以用Sleep(xxx) 控制程序停止响应xxx毫秒
4 function ShutDown(uFlags: Cardinal):boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);var
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error:integer;
begin
error:=0;
// 设置特权
// Delphi2:
//if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, @Token) then
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error := Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid) then
Error := Error or 8;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len) then
Error:=Error or 16;
ExitWindowsEx(uFlags, 0);
Result := (Error=0);
end;调用:
ShutDown(EWX_POWEROFF + EWX_FORCE);//强制关机并无任何提示5 类似第一个问题
系统菜单的更改可以通过修改注册表实现: 因为在不同的地方,右见菜单的内容不相同,所以修改的位置也不同,但原理相同
举个例子,其它的自己去找 例如:
定制右击“开始菜单”和“我的电脑”出现的菜单项:
①添加文件夹的快捷方式(如:我的文件夹(“My Documents)”)
运行注册表编辑器(regedit.exe),在编辑菜单中选择查找命令,查找Directory
主键,找到‘HKEY_CLASSES_ROOT\Directory\shell\’主键,在它下面新建
主键’myitem1’(名称自定),默认值设为: “我的文件夹”(将来出现在右击
菜单中的文字),然后在主键’myitem1’下新建主键‘command’(名称不能为
其它值),其默认值设为:“explorer.exe c:\My Documents”。(该命令的意思
是用资源管理器浏览c:\My Documents文件夹的内容.) ②添加应用程序的快捷方式(如:Word)
运行注册表编辑器(regedit.exe),在编辑菜单中选择查找命令,查找Directory
主键,找到‘HKEY_CLASSES_ROOT\Directory\shell\’主键,在它下面新建
主键’myitem2’(名称自定),默认值: Word(将来出现在右击菜单中的文字),
然后在主键’myitem2’下新建主键‘command’(名称不能为其它值),其默认值
设为:"C:\Program Files\Microsoft Office\Office\WINWORD.EXE"。
(该命令的意思是启动应用程序:
C:\Program Files\Microsoft Office\Office\WINWORD.EXE.) ③添加命令(如:关机)
运行注册表编辑器(regedit.exe),在编辑菜单中选择查找命令,查找
Directory主键,找到‘HKEY_CLASSES_ROOT\Directory\shell\’主键,
在它下面新建主键’myitem3’(名称自定),默认值: “关闭计算机”
(将来出现在右击菜单中的文字),然后在主键’myitem3’下新建主键
‘command’(名称不能为其它值),其默认值设为:“Rundll32.exe
User.exe,ExitWindows”。(该命令的意思是关闭计算机.)
上面的方法添加的是右击“开始菜单”(其实是任一文件夹)出现的内容,
要定制右击“我的电脑”或“网上邻居”出现的内容,上面新建主键的位置
变一下即可.
我这次又有几个问题想请教一下:
1 怎样用程序实现在“发送到”的右键菜单的子菜单增加内容,怎样打开SENDTO子目录,以及怎样在SENDTO里面建立快捷方式。
2 请问一下,假如有两个变量,一个是PCHAR的,还有个是CAPTION,要CAPTION的值赋给PCHAR的变量,该怎么办?
3,我想在主窗口的右上角的关闭按键,一按就关闭程序,有什么办法不让它关闭,
别忘记给我分数!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TForm1 = class(TForm)
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=false;
end;end.
就这么难?
佩服:)
不过……
发分时不要超过3贴
否则我要删贴的
//其实不需要改你自己注册表,也用不到COM什么的;在你的Windows系统盘搜索“SendTo”文件夹(比如在Win2000中为“D:\Documents and Settings\Administrator\SendTo”),然后在SendTo文件夹中加入快捷方式即可。
2 请问一下,假如有两个变量,一个是PCHAR的,还有个是CAPTION,要CAPTION的值赋给PCHAR的变量,该怎么办?
3,我想在主窗口的右上角的关闭按键,一按就关闭程序,有什么办法不让它关闭,
//tangyong_delphi() 提供的方法是可行的,但是这样会产生一个问题,就是再你的这个程序关闭之前,Windows不能注销和关机-----因为CanClose:=false;
这句让你的程序不能关闭!
可以这样:
procedure SysCommand(var msg:TWMSysCommand);message WM_SysCommand;
//这句写在 Type 下 private 之前
然后实现它:
procedure TFORM1.SysCommand(var msg: TWMSysCommand);
begin
if msg.CmdType = SC_CLOSE then
msg.cmdtype:= SC_DEFAULT;
inherited;
end;
这样点右上角的关闭按键不会关闭程序,Windows也能注销和关机。
------------------------------------
说明:点右上角的关闭按键实际上发出了SysCommand命令,SC_CLOSE 表示关闭程序,改为SC_DEFAULT就取消关闭了。
在form的onclosequery中关掉CanClose
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=false;
end;
3.启动界面的时间应该怎么控制?
在DPR文件中加入以下代码:
var
splashfrm:Tsplashform;
begin
splashfrm:=Tsplashform.create(application);
splashfrm.show;
application.init....
application.createform(form1,tform1);...
application.run;
end;
在splashform中放一个定时器timer1:ttimer;
设定好时间后,加入timer1的触发事件
procedure timer1timer(sender:tobject);
begin
close;
end;
可以随心所欲控制显示时间.
//其实不需要改你自己注册表,也用不到COM什么的;在你的Windows系统盘搜索“SendTo”文件夹(比如在Win2000中为“D:\Documents and Settings\Administrator\SendTo”),然后在SendTo文件夹中加入快捷方式即可。
2 Sleep(xxx) ;就可以了