急!100分求解,如何用程序替换应用程序图标? 大侠救命,我程序就差这一步就可交差了。我想把应用程序A的图标替换为应用程序B的图标,不知道如何实现?求代码注意要程序实现,不是使用别的软件! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先你要获得程序A的图标,方法如下var pp:string; hh:longint;begin if opendialog.Execute then pp:=opendialog.FileName; hh:=ExtractIcon(self.Handle,pchar(pp),0); Drawicon(image1.Canvas.Handle,0,0,hh); Destroyicon(hh);end;然后就可以通过application.Icon来处理了 fengjn(小枫):谢谢我知道如何提取图标(这段代码看过N遍了,这种方法速度还慢),主要是不知道如何写到另一个程序上! if opendialog1.Execute then begin pp:=opendialog1.FileName; hh:=ExtractIcon(self.Handle,pchar(pp),0); application.Icon.Handle:= hh; end; 我记得有例子的参看Delphi的ResourceExplorer代码 to fengjn(小枫) 你的代码我试过了,可以用,但是改变程序自身的图标,并且不会保存。执行文件的图标没有改变呢??还望请教 呵呵,理解错了如果想要改变可执行文件的图标,就必须涉及修改应用程序的资源文件,象上面的星星说的那样。具体的方法比较复杂,幸好Delphi给我们提供了例子C:\Program Files\Borland\Delphi6\Demos\ResXplor看看吧,很值得研究的。 我找到答案了,方法是提取本身图标,文件写到字符流中,再定位,用新图标的字符流替换,再保存,我试过了,不过图标的颜色深度会降低!function TForm1.ChangeExeIcon(ExeFile,IconFile:string;Index:Integer=0):Boolean;varTempStream,NewIconMemoryStream:TMemoryStream;OldIconStrings,ExeStrings,ExeIconStrings:TStringStream;ExeIcon:TIcon;IconPosition,IconLength,IconHeadLength:Integer;IconHandle:HICON;ExeFileStream,IconFileStream:TFileStream;beginResult:=False;IconHeadLength:=126;if (not FileExists(ExeFile)) or (not FileExists(IconFile)) then Exit;tryExeFileStream:=TFileStream.Create(ExeFile,fmOpenReadWrite+fmShareDenyWrite);ExeStrings:=TStringStream.Create('');ExeStrings.Position:=0;ExeFileStream.Position:=0;ExeStrings.CopyFrom(ExeFileStream,0);ExeIcon:=TIcon.Create;IconHandle:=ExtractIcon(Application.Handle,Pchar(ExeFile),Index);if IconHandle<=1 thenbeginApplication.MessageBox('EXE中没有找到该序列的图标!',Pchar(Application.Title),MB_ICONERROR+MB_OK);Exit;end;ExeIcon.Handle:=IconHandle;ExeIconStrings:=TStringStream.Create('');ExeIcon.SaveToStream(ExeIconStrings);ExeIcon.Free;ExeIcon:=nil;IconLength:=ExeIconStrings.Size-IconHeadLength;ExeIconStrings.Position:=IconHeadLength;OldIconStrings:=TStringStream.Create('');OldIconStrings.Position:=0;ExeIconStrings.Position:=IconHeadLength;OldIconStrings.CopyFrom(ExeIconStrings,IconLength);ExeIconStrings.Free;IconPosition:=Pos(OldIconStrings.DataString,ExeStrings.DataString);ExeStrings.Free;ExeStrings:=nil;OldIconStrings.Free;IconFileStream:=TFileStream.Create(IconFile,fmOpenRead+fmShareDenyNone);NewIconMemoryStream:=TMemoryStream.Create;IconFileStream.Position:=IconHeadLength;NewIconMemoryStream.Position:=0;NewIconMemoryStream.CopyFrom(IconFileStream,IconFileStream.Size-IconHeadLength);IconFileStream.Free;if IconPosition<=0 thenbeginApplication.MessageBox('EXE中没有找到该图标的数据!',Pchar(Application.Title),MB_ICONERROR+MB_OK);Exit;end;if IconLength<>NewIconMemoryStream.Size thenbeginTempStream:=TMemoryStream.Create;ExeFileStream.Position:=IconPosition+IconLength-1;TempStream.Position:=0;TempStream.CopyFrom(ExeFileStream,ExeFileStream.Size-ExeFileStream.Position);ExeFileStream.Position:=IconPosition-1;NewIconMemoryStream.Position:=0;ExeFileStream.CopyFrom(NewIconMemoryStream,0);TempStream.Position:=0;ExeFileStream.CopyFrom(TempStream,0);ExeFileStream.Position:=0;ExeFileStream.Size:=IconPosition+IconLength-1+TempStream.Size;TempStream.Free;endelsebeginExeFileStream.Position:=IconPosition-1;NewIconMemoryStream.Position:=0;ExeFileStream.CopyFrom(NewIconMemoryStream,0);end;NewIconMemoryStream.Free;Result:=True;finallyExeFileStream.Free;end;end;end. 请问函数声明错在哪儿了? DBchart 的 series 怎麼動態的free掉? 100分求获取外网IP代码 Dephi中“对象、对象引用、类引用、对象指针”有什么区别?如何使用? 高分求助,高人救我!关于image 有关messagebox显示在最上面的问题? 控制报表打印纸张大小 OnFilterRecord出错了? win2000下在那里写可以让自己的程序最先启动 Delphi 6将在今年二季度推出 一个极其简单的问题。但是我不会。up有分! 急救!!!!!!!!!!!11
var pp:string;
hh:longint;
begin
if opendialog.Execute then pp:=opendialog.FileName;
hh:=ExtractIcon(self.Handle,pchar(pp),0);
Drawicon(image1.Canvas.Handle,0,0,hh);
Destroyicon(hh);
end;
然后就可以通过application.Icon来处理了
谢谢
我知道如何提取图标(这段代码看过N遍了,这种方法速度还慢),主要是不知道如何写到另一个程序上!
begin
pp:=opendialog1.FileName;
hh:=ExtractIcon(self.Handle,pchar(pp),0);
application.Icon.Handle:= hh;
end;
参看Delphi的ResourceExplorer代码
你的代码我试过了,可以用,但是改变程序自身的图标,并且不会保存。
执行文件的图标没有改变呢??还望请教
如果想要改变可执行文件的图标,就必须涉及修改应用程序的资源文件,象上面的星星说的那样。具体的方法比较复杂,幸好Delphi给我们提供了例子
C:\Program Files\Borland\Delphi6\Demos\ResXplor
看看吧,很值得研究的。
function TForm1.ChangeExeIcon(ExeFile,IconFile:string;Index:Integer=0):Boolean;
var
TempStream,NewIconMemoryStream:TMemoryStream;
OldIconStrings,ExeStrings,ExeIconStrings:TStringStream;
ExeIcon:TIcon;
IconPosition,IconLength,IconHeadLength:Integer;
IconHandle:HICON;
ExeFileStream,IconFileStream:TFileStream;
begin
Result:=False;
IconHeadLength:=126;
if (not FileExists(ExeFile)) or (not FileExists(IconFile)) then Exit;
try
ExeFileStream:=TFileStream.Create(ExeFile,fmOpenReadWrite+fmShareDenyWrite);
ExeStrings:=TStringStream.Create('');
ExeStrings.Position:=0;
ExeFileStream.Position:=0;
ExeStrings.CopyFrom(ExeFileStream,0);
ExeIcon:=TIcon.Create;
IconHandle:=ExtractIcon(Application.Handle,Pchar(ExeFile),Index);
if IconHandle<=1 then
begin
Application.MessageBox('EXE中没有找到该序列的图标!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
Exit;
end;
ExeIcon.Handle:=IconHandle;
ExeIconStrings:=TStringStream.Create('');
ExeIcon.SaveToStream(ExeIconStrings);
ExeIcon.Free;
ExeIcon:=nil;
IconLength:=ExeIconStrings.Size-IconHeadLength;
ExeIconStrings.Position:=IconHeadLength;
OldIconStrings:=TStringStream.Create('');
OldIconStrings.Position:=0;
ExeIconStrings.Position:=IconHeadLength;
OldIconStrings.CopyFrom(ExeIconStrings,IconLength);
ExeIconStrings.Free;
IconPosition:=Pos(OldIconStrings.DataString,ExeStrings.DataString);
ExeStrings.Free;
ExeStrings:=nil;
OldIconStrings.Free;
IconFileStream:=TFileStream.Create(IconFile,fmOpenRead+fmShareDenyNone);
NewIconMemoryStream:=TMemoryStream.Create;
IconFileStream.Position:=IconHeadLength;
NewIconMemoryStream.Position:=0;
NewIconMemoryStream.CopyFrom(IconFileStream,IconFileStream.Size-IconHeadLength);
IconFileStream.Free;
if IconPosition<=0 then
begin
Application.MessageBox('EXE中没有找到该图标的数据!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
Exit;
end;if IconLength<>NewIconMemoryStream.Size then
begin
TempStream:=TMemoryStream.Create;
ExeFileStream.Position:=IconPosition+IconLength-1;
TempStream.Position:=0;
TempStream.CopyFrom(ExeFileStream,ExeFileStream.Size-ExeFileStream.Position);
ExeFileStream.Position:=IconPosition-1;
NewIconMemoryStream.Position:=0;
ExeFileStream.CopyFrom(NewIconMemoryStream,0);
TempStream.Position:=0;
ExeFileStream.CopyFrom(TempStream,0);
ExeFileStream.Position:=0;
ExeFileStream.Size:=IconPosition+IconLength-1+TempStream.Size;
TempStream.Free;
end
else
begin
ExeFileStream.Position:=IconPosition-1;
NewIconMemoryStream.Position:=0;
ExeFileStream.CopyFrom(NewIconMemoryStream,0);
end;
NewIconMemoryStream.Free;
Result:=True;
finally
ExeFileStream.Free;
end;
end;
end.