占位手记 (0分)

  • 主题发起人 小雨哥
  • 开始时间
to 小雨哥:
有什么办法能真正的清空IE的历史记录?
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1627207
谢谢你的回答,但用你的方法试过,还是不行,还有没有可靠的方法,能否告之?
 
TO:DarwinZhang 兄:
我手里有的富翁图片,就是在那个帖子里公布的一些,后来陆续在浏览各个富翁站点时,
偶尔也找到一些,曾经打算为每个有图片的富翁配一句“论坛语录”,所以就老去按名字
看帖子,查查他说了哪些至理名言 :)
另外,北京大富翁每次聚会时,也会有一些照片的,看了一下,总共有 10 多兆,开始实
在搞不清谁是谁,慢慢查得多了,请教了一些老富翁,才大致有点明白,不过还有很多搞
不清谁是谁的,直到现在,我看到各位富翁时,还是会问:“这张哪个是你啊” :)
听说你最近好象在杭州,有空的话,我请你喝茶,,吃饭也行。 :)
 
TO:yesky_2008 和 YFeral :(关于清除历史记录)
我正在查。每当刚开机时,可以完全清除历史记录,但当使用一段时间后就不行。好象
是系统会缓存这些记录一样(我的系统是 Windows 2000)。目前有几个参数的用法还不清
楚,比如上面 Next 方法中,第一个参数,我在例子中定为 1,在 MSDN 文档中写着:
这个参数没有实现。:-( ,什么意思?用 0 就不能填充 urlSTATURL 这个数据结构了。
 
中元在 http://www.webANYwhere.net/ 有一篇使用 CryptoAPI 加解密的演示例子,不妨
看看。CryptoAPI 是 Windows 内部的证书、密码、加解密密码系统函数库,目前已经到
了 2.0 ,但我使用的 Windows 2000 好象不支持 2.0 版本。
 
楼主,你的那个删History下的历史记录的不行啊。有人试了。
 
TO:YFeral
现象我在上面已经讲了,实际情况是:当我例子程序的方法不能清除时,IE 自己在菜单
--->工具--->Internet选项 里的“清除历史记录”按钮也不能清除了。但每次开机立即
执行上面的例子,历史记录居然又可以完全清除了。我觉得是系统方面的原因。
另外,在 IE6 中,IUrlHistoryStg2 的 ClearHistory 方法实际就是使用了 Next 枚举。
上面帖子有一句:“好象是系统会缓存这些记录一样”,正确的说法是,我们清除的只是
已经缓存在系统中的记录,没有实质性地调用磁盘文件清除。
 
to 小雨哥 兄: "有空的话,我请你喝茶,,吃饭也行。"
真是好人哪!谢谢您了!怎么好意思呢?
这么说,您也在杭州?有机会可以认识一下。
您知道,我是业余的,所以知识面是比较窄的,全凭自己的瞎子摸象,呵呵。[:)]
请到:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1652110

to 小笨苯:你的动作也真快,我一点机会都没有。[:)]
另外,好像历史记录也是存在某个文件夹里面,好像可以直接用删除文件的办法删除。
 
MSN 最大的缺点我觉得是不能保存聊天记录,MSNHelper 新版本也开始不能用了。虽然,我可
以使用窗口枚举获得 MSN 的聊天窗口,并进一步获得 MSN 的 RichEdit20W 子窗口,通过读取
这个子窗口的文字,随时将它保存到文件,但有 2 个缺点,首先是文件的内容太多重复,第 2
是老是要记着执行保存。有没有好的办法解决它呢?重复文字,我们可以开两个缓存,根据对比
结果确定保存哪些文字,自动保存,放一个 Time 控件就应该可以的。又有没有更好的办法了?
以下是获取 MSN 聊天窗口并获取内部文字的代码:
====================================================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function ChildWnd(Wnd: HWND;
Param: lParam): Boolean;stdcall;
var
Buffer:array[0..32]of char;
str:String;
Clipboard:THandle;
ChatPtr:pChar;
begin
Result:=true;
if GetClassName(Wnd,@Buffer,32)=0 then
exit;
Str:=StrPas(@Buffer);
if (Str='RichEdit20W') or (Str='RichEdit20A') then
begin
SendMessage(Wnd,EM_SETSEL,0,-1);
SendMessage(Wnd,WM_COPY,0,0);
SendMessage(Wnd,EM_SETSEL,-1,0);
if IsClipboardFormatAvailable(CF_TEXT) then
begin
OpenClipboard(0);
Clipboard:=GetClipboardData(CF_TEXT);
ChatPtr:=GlobalLock(Clipboard);
// .... 这里可以添加查找文字中重复的内容,过滤它
Form1.Memo1.Text:=StrPas(ChatPtr);
// .... 这里可以添加保存到文件的代码 (或在 Memo Change 加)
GlobalUnlock(Clipboard);
CloseClipboard;
end;
end;
end;

function MainWindows(Wnd: HWND;
Param: lParam): Boolean;stdcall;
var
Buffer:array[0..63]of Char;
str:String;
begin
Result:=true;
GetWindowText(wnd,@Buffer,63);
if StrLen(@Buffer)<1 then
exit;
Str:=StrPas(@Buffer);
if Pos('- 对话',Str) = 0 then
exit
else
EnumChildWindows(Wnd,@ChildWnd,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Caption - Get MSN Chat
Memo1.WordWrap:=True;
EnumWindows(@MainWindows,0);
end;
end.
 
to:小雨哥:
单步执行代码到
if UrlHistory.DeleteUrl(P,0)=1 then

查看P里有浏览的地址记录,可到
C:/Documents and Settings/用户名/Local Settings/History
下记录还是都在。然后用IE的Internet选项里的清除历史记录再查看
History里记录已经没有。不知怎么回事。
 
TO:yesky_2008
哇塞啊,头有点大了。我还没弄出来,再给点时间好吗。
 
关于清除 IE 历史记录,基本搞清楚是怎么回事了。
历史记录在 MS 的安排下,根据会话期分为全局历史记录和会话期历史记录。
上面所用的接口是针对当前会话期历史记录的操作,当会话期结束,自动将历史记录
变更为全局历史记录,全局历史记录可以显示在“历史记录”板中。为此,必须找到
操作全局历史记录的接口。可惜,我没有找到这样的接口,MSDN 上没有任何文字记载。
作为一个问题,我打算使用 DarwinZhang 兄提出的直接删文件夹的手段,在 2000 中,
这个文件夹好象是 %USERPROFILE%/Local Settings/History/History.IE5/ ,这个目
录保存在注册表里,但保存的 KEY 很奇特,是一个可变字串。用 Delphi 的注册表包
装函数是无法直接取得的,必须调用 RegEnumKeyEx 来取得。取到后直接递归删除这个
文件夹下的全部内容即可。
 
to:小雨哥:
在dos下进入C:/Documents and Settings/用户名/Local Settings/History
目录,dir/a可看到desktop.ini和History.IE5文件。它们都是系统和隐藏文件,用attrib -s -s可
去除系统和隐藏属性。在windows下即可看到这些文件。可如删除会出现“无法删除,共享冲突,源文件和目标文件正在使用。”
不知怎么解决。
 
纠正以上是attrib -s -h
 
TO:yesky_2008:不好意思,我目前也没有什么好办法。
-------------------------------------------------
Windows 系统新的版本不断,老的获取系统版本的函数最近已经有了变化,以前有个帖子
曾经讨论过,现在居然找不到了。我将我在那次讨论中我完成的部分贴出来吧。
----------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
POSVersionInfoExA = ^TOSVersionInfoExA;
POSVersionInfoExW = ^TOSVersionInfoExW;
POSVersionInfoEx = POSVersionInfoExA;
_OSVersionInfoExA = record
dwOSVersionInfoSize: LongInt;
dwMajorVersion: LongInt;
dwMinorVersion: LongInt;
dwBuildNumber: LongInt;
dwPlatformId: LongInt;
szCSDVersion: array[0..127] of AnsiChar;
wServicePackMajor: Word;
wServicePackMinor: Word;
wSuiteMask: Word;
wProductType: BYTE;
wReserved: BYTE;
end;

_OSVersionInfoExW = record
dwOSVersionInfoSize: LongInt;
dwMajorVersion: LongInt;
dwMinorVersion: LongInt;
dwBuildNumber: LongInt;
dwPlatformId: LongInt;
szCSDVersion: array[0..127] of WideChar;
wServicePackMajor: Word;
wServicePackMinor: Word;
wSuiteMask: Word;
wProductType: BYTE;
wReserved: BYTE;
end;

_OSVERSIONINFOEX = _OSVERSIONINFOExA;
TOSVersionInfoExA = _OSVERSIONINFOExA;
TOSVersionInfoExW = _OSVERSIONINFOExW;
TOSVersionInfoEx = TOSVersionInfoExA;
OSVERSIONINFOExA = _OSVERSIONINFOExA;
OSVERSIONINFOExW = _OSVERSIONINFOExW;
OSVERSIONINFOEx = OSVERSIONINFOExA;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function GetWindowsVersion:String;
end;

function GetVersionExA(var lpVersionInformation: TOSVersionInfoEx):
BOOL;
stdcall;external kernel32 name 'GetVersionExA';
{$IFDEF UNICODE}
function GetVersionEx(var lpVersionInformation: TOSVersionInfoEx):
BOOL;
stdcall;external kernel32 name 'GetVersionExW';
{$else
}
function GetVersionEx(var lpVersionInformation: TOSVersionInfoEx):
BOOL;
stdcall;external kernel32 name 'GetVersionExA';
{$ENDIF}
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.GetWindowsVersion: String;
var
osv:TOSVersionInfoEx;
ServiceRelease, // 服务补丁包版本串
str // 系统版本串
:string;
begin
//**********************************************************************
ZeroMemory(@osv, sizeof(TOSVERSIONINFOEX));
osv.dwOSVersionInfoSize:=SizeOf(TOSVersionInfoEx);
if (GetVersionEx(osv)) then
begin
ServiceRelease:='Service Pack '+IntToStr(osv.wServicePackMajor)+'.'
+IntToStr(osv.wServicePackMinor);
end
else
begin
osv.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
if GetVersionEx(osv) then
ServiceRelease:=StrPas(osv.szCSDVersion)
else
exit;
end;
case osv.dwPlatformId of
VER_PLATFORM_WIN32s:str :='Microsoft Windows 3.1(TM)';
VER_PLATFORM_WIN32_WINDOWS:
if(osv.dwMinorVersion = 0) then
// Win95 or Win98 or WinME 从这个分支分析
str := 'Microsoft Windows 95(TM) '+ ServiceRelease
else
if(osv.dwMinorVersion = 10) then
str := 'Microsoft Windows 98(TM) ' + ServiceRelease
else
if(osv.dwMinorVersion = 90) then
str := 'Microsoft Windows Millenium(TM) ' + ServiceRelease
else
str := 'Unknown WIN32 operating system';
VER_PLATFORM_WIN32_NT:
begin
if (osv.dwMajorVersion = 3) then
str := 'Microsoft(R) Windows NT 3.51(TM) '+ ServiceRelease
else
if (osv.dwMajorVersion = 4) then
str := 'Microsoft Windows NT4.0(TM) ' + ServiceRelease
else
if(osv.dwMajorVersion = 5) then
begin
if (osv.dwMinorVersion = 0) then
str := 'Microsoft Windows 2000(TM) ' + ServiceRelease
else
if (osv.dwMinorVersion = 1) then
str := 'Microsoft Windows XP(TM) ' + ServiceRelease
else
if (osv.dwMinorVersion = 2) then
str := 'Windows .NET Server(TM) ' + ServiceRelease
else
str := 'Unknown WINNT operating system' end;
end;
else
str :='Unknown Platform Found!';
end;
result:=str+' '+#13+'Build:'+IntToStr(osv.dwBuildNumber)+' '+
IntToStr(osv.wProductType);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(0,PChar(GetWindowsVersion),'版本信息',mb_Ok or mb_IconInformation);
end;
end.
 
to 小雨哥兄:费了好大的劲我才发现您是老富翁了,决不是
注册时间 登陆次数 提问次数 回复次数 每贴得分
2002-10-2 1116 13 930 5.42
这样简单,呵呵。 [:)]
大约这个星期天就可以爬山了,到时候我通知您。(星期六是.....) [:)]
to yesky_2008: 一定是别的进程在使用,杀掉那个进程(叟主意)。[:D]
 
TO:DarwinZhang 兄
大约周六我会有电话给你的。先我后你,周日听你的。 :)
===============================================================================
当一个显示在桌面的应用程序,希望自己不在任务条上有按钮,列举一下大约有以下办法:
1.做为一个风格为 WS_EX_TOOLWINDOW 的隐藏的窗口的子窗口显示。
2.直接改变窗口风格为 WS_EX_TOOLWINDOW ( 即 Delphi 中的 bsSizeToolWin )
3.把任务条看作 TabCtrl 控件,找到句柄发送删除标签命令(必须启动立即执行)
下面的办法也可以做到上面的效果:
Shell COM 接口中,有一个 ITaskbarList 的接口,利用它就可以做到:
-------------------------------------------------------------------------------
const
IID_ITaskbarList:TGUID='{56FDF342-FD6D-11d0-958A-006097C9A090}';
CLSID_TaskbarList:TGUID='{56FDF344-FD6D-11d0-958A-006097C9A090}';
type
ITaskbarList = interface(IUnknown)
['{56FDF342-FD6D-11d0-958A-006097C9A090}']
function HrInit:HResult;stdcall;
function AddTab(Wnd:HWND): HResult;
stdcall;
function DeleteTab(Wnd:HWND): HResult;
stdcall;
function ActivateTab(Wnd:HWND): HResult;
stdcall;
function SetActiveAlt(Wnd:HWND): HResult;
stdcall;
end;
-------------------------------------------------------------------------------
以上是这个接口的声明,下面我们这样做:(需要 uses ComObj 单元)
-------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
Taskbar:ITaskbarList;
begin
TaskBar:=CreateComObject(CLSID_TaskbarList) as ITaskbarList;
Taskbar.HrInit;
// 调用这个接口的初始化方法
Taskbar.DeleteTab(Application.Handle);
// 删除本程序按钮
end;
-------------------------------------------------------------------------------
让它恢复显示,就调用 Taskbar.AddTab(Application.Handle) 方法。注意的是这里的
窗口句柄,不是 Form 的,而应该是 Application 的。Application 在 Delphi 中是真正
的主窗口。
不过,这个方法,一旦调用 Form 最小化,它还是会被显示出来,所以一旦删除了标签,最
好是立即把程序隐藏掉。(其他情形好象不会露马脚)
看得出,使用这个方法的一个特点是,可以删除任意的任务条按钮,只要使用查找窗口函数,
找到相应窗口的 HWnd 就可以使它不在任务条显示。
 
to DarwinZhang:
不知哪个进程,所有程序等都关闭了。
 
to yesky_2008: Win2K/XP下用任务管理器杀, 9x下: Ctrl+Alt+Del杀
我能讲的就只有这么些了。[:(]
 
顶部