高手请进!三大难题求解!!!(95分)

  • 主题发起人 主题发起人 ybsnui
  • 开始时间 开始时间
WIN98下不行吗???
 
var
hmu:HWND;Ret:Integer;
begin
application.Initialize;
Application.Title :='Prpgram Run Once Test';
hmu := CreateMutex(nil,False,'Program Run Once Text');
Ret := GetLastError ;
if Ret<>ERROR_ALREADY_EXISTS then
begin
Appliction.Create(TForm1,Form1);
Application.Run;
end
else
Application.MessageBox('本程序已经在运行了!','警告',MB_OK);
ReleaseMutext(hmu);
end;
 
关于你的前两个问题非常简单,自己写个桌面程序命名为EXPLORER.exe然后copy到windows
下就ok了,我的软件中就这样做的。
 
上面这位大虾能不能详细点!!!!!谢谢!!!!!
 
我的方法是非正规方法,但很简单、有效。自己写一个名叫Explorer的桌面程序,Copy到
Windows下将Windows自带的Explorer覆盖然后重启就一切OK。至于这个程序如何就看你的
创意与功力了。我还不够详细吗?把你的要求详细些。
 
能不能提供一个范例的源码看看!谢谢!
分数全给你!!!
 
在 WIN.INI 中添加 shell=你的程序名字即可
 
一个小程序发给你。
 
对不起忘了,你的Email?
 
TO z1234:有源码吗?谢谢!
my email:byflyer@163.net
 
1、在目录中加个文件folder.htt。该文件在WINDOWS目录中有。
可以改成要密码才能打开的目录等VBSCRIP写的。
2、在注册表中加个键值就可以让拒绝所有的REG工具操作。
3、找篇文章,好象是《未公开的API监视SHELL》吧。好多地方有。找不到的话 告诉我
我帮你找。QQ2336170
 
to jamw
folder.htt没什么用,用这个就有点像在EXPLORER的“文件夹选项”里把隐藏文件和系统
文件不显示出来,只能用来骗骗不懂电脑的人。只要我的文件夹浏览方式不使用WEB页方式
folder.htt就不起任何作用了;
至于第二点,注册表中的这个键值是大家都知道的了,我只要写个REG文件,把这个键值改
为0,再把这个REG文件导入注册表就破掉了;
第三点的SHELL监视API的我这有,干脆我贴出来吧:(转自CSDN,AND我还没试过,不知行不行)
     利用未公开函数实现shell操作监视 wwwa.applevb.com

在windows下有一个未公开函数shchangenotifyregister可以吧你的窗口添加到系统的
系统消息监视链中,该函数在delphi中的定义如下:
function shchangenotifyregister(hwnd,uflags,dweventid,umsg,citems:longword;
lpps:pidlstruct):integer;stdcall;external 'shell32.dll' index 2;
其中参数hwnd定义了监视系统操作的窗口得句柄,参数uflags dweventid定义监视操作参数,
参数umsg定义操作消息,参数citems定义附加参数,参数lpps指定一个pidlstruct结构,该
结构指定监视的目录。
当函数调用成功之后,函数会返回一个监视操作句柄,同时系统就会将hwnd指定的窗口
加入到操作监视链中,当有文件操作发生时,系统会向hwnd发送umsg指定的消息,我们只要
在程序中加入该消息的处理函数就可以实现对系统操作的监视了。如果要退出程序监视,就
要调用另外一个未公开得函数shchangenotifyderegister来取消程序监视。
下面是使用delphi编写的具体程序实现范例,首先建立一个新的工程文件,然后在
form1中加入一个button控件和一个memo控件,程序的代码如下:

unit unit1;

interface

uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
stdctrls,shlobj,activex;

const
shcne_renameitem = $1;
shcne_create = $2;
shcne_delete = $4;
shcne_mkdir = $8;
shcne_rmdir = $10;
shcne_mediainserted = $20;
shcne_mediaremoved = $40;
shcne_driveremoved = $80;
shcne_driveadd = $100;
shcne_netshare = $200;
shcne_netunshare = $400;
shcne_attributes = $800;
shcne_updatedir = $1000;
shcne_updateitem = $2000;
shcne_serverdisconnect = $4000;
shcne_updateimage = $8000;
shcne_driveaddgui = $10000;
shcne_renamefolder = $20000;
shcne_freespace = $40000;
shcne_assocchanged = $8000000;
shcne_diskevents = $2381f;
shcne_globalevents = $c0581e0;
shcne_allevents = $7fffffff;
shcne_interrupt = $80000000;

shcnf_idlist = 0; // lpitemidlist
shcnf_patha = $1; // path name
shcnf_printera = $2; // printer friendly name
shcnf_dword = $3; // dword
shcnf_pathw = $5; // path name
shcnf_printerw = $6; // printer friendly name
shcnf_type = $ff;

shcnf_flush = $1000;

shcnf_flushnowait = $2000;
shcnf_path = shcnf_pathw;
shcnf_printer = shcnf_printerw;

wm_shnotify = $401;
noerror = 0;

type
tform1 = class(tform)
button1: tbutton;
memo1: tmemo;
procedure formclose(sender: tobject; var action: tcloseaction);
procedure button1click(sender: tobject);
procedure formcreate(sender: tobject);
private
{ private declarations }
procedure wmshellreg(var message:tmessage);message wm_shnotify;
public
{ public declarations }
end;

type pshnotifystruct=^shnotifystruct;
shnotifystruct = record
dwitem1 : pitemidlist;
dwitem2 : pitemidlist;
end;

type pshfileinfobyte=^shfileinfobyte;
_shfileinfobyte = record
hicon :integer;
iicon :integer;
dwattributes : integer;
szdisplayname : array [0..259] of char;
sztypename : array [0..79] of char;
end;
shfileinfobyte=_shfileinfobyte;

type pidlstruct = ^idlstruct;
_idlstruct = record
pidl : pitemidlist;
bwatchsubfolders : integer;
end;
idlstruct =_idlstruct;


function shnotify_register(hwnd : integer) : bool;
function shnotify_unregister:bool;
function sheventname(strpath1,strpath2:string;lparam:integer):string;

function shchangenotifyderegister(hnotify:integer):integer;stdcall;
external 'shell32.dll' index 4;
function shchangenotifyregister(hwnd,uflags,dweventid,umsg,citems:longword;
lpps:pidlstruct):integer;stdcall;external 'shell32.dll' index 2;
function shgetfileinfopidl(pidl : pitemidlist;
dwfileattributes : integer;
psfib : pshfileinfobyte;
cbfileinfo : integer;
uflags : integer):integer;stdcall;
external 'shell32.dll' name 'shgetfileinfoa';

var
form1: tform1;
m_hshnotify:integer;
m_pidldesktop : pitemidlist;

implementation

{$r *.dfm}

function sheventname(strpath1,strpath2:string;lparam:integer):string;
var
sevent:string;
begin
case lparam of file://根据参数设置提示消息
shcne_renameitem: sevent := '重命名文件'+strpath1+'为'+strpath2;
shcne_create: sevent := '建立文件 文件名:'+strpath1;
shcne_delete: sevent := '删除文件 文件名:'+strpath1;
shcne_mkdir: sevent := '新建目录 目录名:'+strpath1;
shcne_rmdir: sevent := '删除目录 目录名:'+strpath1;
shcne_mediainserted: sevent := strpath1+'中插入可移动存储介质';
shcne_mediaremoved: sevent := strpath1+'中移去可移动存储介质'+strpath1+' '
              +strpath2;
shcne_driveremoved: sevent := '移去驱动器'+strpath1;
shcne_driveadd: sevent := '添加驱动器'+strpath1;
shcne_netshare: sevent := '改变目录'+strpath1+'的共享属性';

shcne_attributes: sevent := '改变文件目录属性 文件名'+strpath1;
shcne_updatedir: sevent := '更新目录'+strpath1;
shcne_updateitem: sevent := '更新文件 文件名:'+strpath1;
shcne_serverdisconnect: sevent := '断开与服务器的连接'+strpath1+' '+strpath2;
shcne_updateimage: sevent := 'shcne_updateimage';
shcne_driveaddgui: sevent := 'shcne_driveaddgui';
shcne_renamefolder: sevent := '重命名文件夹'+strpath1+'为'+strpath2;
shcne_freespace: sevent := '磁盘空间大小改变';
shcne_assocchanged: sevent := '改变文件关联';
else
sevent:='未知操作'+inttostr(lparam);
end;
result:=sevent;
end;

function shnotify_register(hwnd : integer) : bool;
var
ps:pidlstruct;
begin
{$r-}
result:=false;
if m_hshnotify = 0 then begin
file://获取桌面文件夹的pidl
if shgetspecialfolderlocation(0, csidl_desktop,
m_pidldesktop)<> noerror then
form1.close;
if boolean(m_pidldesktop) then begin
ps.bwatchsubfolders := 1;
ps.pidl := m_pidldesktop;

// 利用shchangenotifyregister函数注册系统消息处理
m_hshnotify := shchangenotifyregister(hwnd, (shcnf_type or shcnf_idlist),
(shcne_allevents or shcne_interrupt),
wm_shnotify, 1, ps);
result := boolean(m_hshnotify);
end
else
// 如果出现错误就使用 cotaskmemfree函数来释放句柄
cotaskmemfree(m_pidldesktop);
end;
{$r+}
end;

function shnotify_unregister:bool;
begin
result:=false;
if boolean(m_hshnotify) then
file://取消系统消息监视,同时释放桌面的pidl
if boolean(shchangenotifyderegister(m_hshnotify)) then begin
{$r-}
m_hshnotify := 0;
cotaskmemfree(m_pidldesktop);
result := true;
{$r-}
end;
end;

procedure tform1.wmshellreg(var message:tmessage); file://系统消息处理函数
var
strpath1,strpath2:string;
charpath:array[0..259]of char;
pidlitem:pshnotifystruct;
begin
pidlitem:=pshnotifystruct(message.wparam);
file://获得系统消息相关得路径
shgetpathfromidlist(pidlitem.dwitem1,charpath);
strpath1:=charpath;
shgetpathfromidlist(pidlitem.dwitem2,charpath);
strpath2:=charpath;

memo1.lines.add(sheventname(strpath1,strpath2,message.lparam)+chr(13)+chr(10));
end;

procedure tform1.formclose(sender: tobject; var action: tcloseaction);
begin
file://在程序退出的同时删除监视
if boolean(m_pidldesktop) then
shnotify_unregister;
end;

procedure tform1.button1click(sender: tobject); file://button1的click消息
begin
m_hshnotify:=0;
if shnotify_register(form1.handle) then begin file://注册shell监视
showmessage('shell监视程序成功注册');
button1.enabled := false;
end
else
showmessage('shell监视程序注册失败');
end;

procedure tform1.formcreate(sender: tobject);
begin
button1.caption := '打开监视';
end;

end.

运行程序,点击“打开监视”按钮,如果出现一个显示“shell监视程序成功注册”的
对话框,说明form1已经加入到系统操作监视链中了,你可以试着在资源管理器中建立、删
除文件夹,移动文件等操作,你可以发现这些操作都被纪录下来并显示在文本框中。
在上面的程序中多次使用到了一个pitemidlist的结构,这个数据结构指定windows下得
一个“项目”,在windows下资源实现统一管理一个“项目”可以是一个文件或者一个文件夹
,也可以是一个打印机等资源。另外一些api函数也涉及到了shell(windows外壳)操作,各位
读者可以参考相应的参考资料。
 
接受答案了.
 
TO Z1234:
关于你的前两个问题非常简单,自己写个桌面程序命名为EXPLORER.exe然后copy到windows
下就ok了,我的软件中就这样做的。

我想知道用完自己的程序后想回到WINDOWS的本来系统中是如何做的?
我在我的程序中调用本来的EXPLORER。EXE出来的只是资源管理器,
请指教
OICQ:6239970
MAIL:kannychen@hotmail.com
 
后退
顶部