如何修改程序自身的图标?

深宇 2010-12-24 04:44:58
加精
大家都知道程序图标可以在项目的选项里修改,但是如何通过代码修改自身的图标呢?哪怕修改完之后需要退出程序也可以。
...全文
5160 122 打赏 收藏 转发到动态 举报
写回复
用AI写文章
122 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynduanlian 2012-09-05
  • 打赏
  • 举报
回复
搬个凳子看纯蓝的代码
jektion 2011-07-06
  • 打赏
  • 举报
回复
不错不错学习
深宇 2011-01-06
  • 打赏
  • 举报
回复
删除自身还是可以实现的,现在需要更进一步,修改自身的图标
zyp2524153 2011-01-05
  • 打赏
  • 举报
回复
我的意思是,本身的程序用winexec调用这个程序,调用的时候,把本身的路径当作参数传递进去,然后关闭自身,由调用的程序修改图标并保存。
zyp2524153 2011-01-05
  • 打赏
  • 举报
回复
本身修改本身肯定是不可能的,你运行程序的时候能删除吗?正在运行的程序怎么可能被修改?
深宇 2011-01-05
  • 打赏
  • 举报
回复
借助外部程序来实现的话就不符合要求了,要求的是完全依靠自己本身来修改自己本身的图标。
dsh8411 2011-01-04
  • 打赏
  • 举报
回复
挺有意思~~~
zyp2524153 2011-01-04
  • 打赏
  • 举报
回复

Unit Unit1;

Interface

Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, shellapi;

Type
TForm1 = Class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Image1: TImage;
Button2: TButton;
Edit1: TEdit;
Procedure Button1Click(Sender: TObject);
Procedure Button2Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure FormShow(Sender: TObject);
Private
Function ChangeExeIcon(ExeFile, IconFile: String; Index: Integer = 0):
Boolean; //2+
Procedure Extract_Icon;
{ Private declarations }
Public
{ Public declarations }
End;

Var
Form1: TForm1;
Icon_Index: Integer; //2+
szFileName: String;
Implementation

{$R *.dfm}

//获取系统目录

Function GetDirectory(dInt: Integer): String;
Var
s: Array[0..255] Of Char;
Begin
Case dInt Of
0: GetWindowsDirectory(@s, 256); //Windows安装文件夾所存在的路径 c:\windows\
1: GetSystemDirectory(@s, 256); //系统文件夾所存在的路径 c:\windows\system32\
2: GetTempPath(256, @s); //Temp文件夾所存在的路径 当前用户的TEMP目标不带\
End;
If dInt = 2 Then
result := String(s)
Else
result := String(s) + '\';
End;
////////////////////////////////////////////////////////////

Procedure TForm1.FormCreate(Sender: TObject);
Begin
szFileName := pchar(GetDirectory(2) + '789.ico');
//szFileNameTEMP目录中的789图标
End;
////////////////////////////////////////////////////////////

Procedure TForm1.Extract_Icon;
Var
icon_handle: Longint;
buffer: Array[0..1024] Of Char;
Begin
If Not (FileExists(Edit1.Text)) Then
Exit; //判断文件是否存在
StrPCopy(buffer, Edit1.Text);
icon_handle := ExtractIcon(self.Handle, buffer, Icon_Index);
If icon_handle = 0 Then
Begin
If Icon_Index = 0 Then
Begin
Application.MessageBox('这个文件没有发现图标,请重新选择!', '信息',
MB_ICONINFORMATION + MB_OK);
Image1.Visible := False;
End
Else
Icon_Index := Icon_Index - 1;
Exit;
End;
Image1.Picture.Icon.Handle := icon_handle;
Image1.Visible := True;
End;
//API函数ExtractIcon来取出EXE里面的图标.下面是修改图标的函数

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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
Exit;
End;
ExeIcon.Handle := IconHandle;
ExeIconStrings := TStringStream.Create('');
ExeIcon.SaveToStream(ExeIconStrings);
ExeIcon.Free;
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;
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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
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
End;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1);
If Not (ExeFile = '') Then
Begin
If ChangeExeIcon(ExeFile, szFileName) Then
Begin
MessageBox(Handle, '更换图标成功!', '提示', 64);
End
Else
MessageBox(Handle, '更换图标失败!', '提示', 64);
End;
Close;
End;

Procedure TForm1.Button2Click(Sender: TObject);
Begin
OpenDialog1.Filter :=
'所有支持类型(*.EXE,*.DLL,*.OCX,*.ICL,*.ICO,*.BMP)|*.exe;*.dll;*.ocx;*.icl;*.ico;*.bmp|所有文件(*.*)|*.*';
If OpenDialog1.Execute Then
Begin
Edit1.Text := OpenDialog1.Filename;
Icon_Index := 0;
Extract_Icon;
End;
Image1.Picture.Icon.SaveToFile(szFileName); //保存图标
End;

Procedure TForm1.FormShow(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1); //判断是否有参数
If ExeFile = '' Then
Begin
Close;
End;
End;

End.
zyp2524153 2011-01-04
  • 打赏
  • 举报
回复
干脆贴源码算了;


Unit Unit1;

Interface

Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, shellapi;

Type
TForm1 = Class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Image1: TImage;
Button2: TButton;
Edit1: TEdit;
Procedure Button1Click(Sender: TObject);
Procedure Button2Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure FormShow(Sender: TObject);
Private
Function ChangeExeIcon(ExeFile, IconFile: String; Index: Integer = 0):
Boolean; //2+
Procedure Extract_Icon;
{ Private declarations }
Public
{ Public declarations }
End;

Var
Form1: TForm1;
Icon_Index: Integer; //2+
szFileName: String;
Implementation

{$R *.dfm}

//获取系统目录

Function GetDirectory(dInt: Integer): String;
Var
s: Array[0..255] Of Char;
Begin
Case dInt Of
0: GetWindowsDirectory(@s, 256); //Windows安装文件夾所存在的路径 c:\windows\
1: GetSystemDirectory(@s, 256); //系统文件夾所存在的路径 c:\windows\system32\
2: GetTempPath(256, @s); //Temp文件夾所存在的路径 当前用户的TEMP目标不带\
End;
If dInt = 2 Then
result := String(s)
Else
result := String(s) + '\';
End;
////////////////////////////////////////////////////////////

Procedure TForm1.FormCreate(Sender: TObject);
Begin
szFileName := pchar(GetDirectory(2) + '789.ico');
//szFileNameTEMP目录中的789图标
End;
////////////////////////////////////////////////////////////

Procedure TForm1.Extract_Icon;
Var
icon_handle: Longint;
buffer: Array[0..1024] Of Char;
Begin
If Not (FileExists(Edit1.Text)) Then
Exit; //判断文件是否存在
StrPCopy(buffer, Edit1.Text);
icon_handle := ExtractIcon(self.Handle, buffer, Icon_Index);
If icon_handle = 0 Then
Begin
If Icon_Index = 0 Then
Begin
Application.MessageBox('这个文件没有发现图标,请重新选择!', '信息',
MB_ICONINFORMATION + MB_OK);
Image1.Visible := False;
End
Else
Icon_Index := Icon_Index - 1;
Exit;
End;
Image1.Picture.Icon.Handle := icon_handle;
Image1.Visible := True;
End;
//API函数ExtractIcon来取出EXE里面的图标.下面是修改图标的函数

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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
Exit;
End;
ExeIcon.Handle := IconHandle;
ExeIconStrings := TStringStream.Create('');
ExeIcon.SaveToStream(ExeIconStrings);
ExeIcon.Free;
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;
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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
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
End;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1);
If Not (ExeFile = '') Then
Begin
If ChangeExeIcon(ExeFile, szFileName) Then
Begin
MessageBox(Handle, '更换图标成功!', '提示', 64);
End
Else
MessageBox(Handle, '更换图标失败!', '提示', 64);
End;
Close;
End;

Procedure TForm1.Button2Click(Sender: TObject);
Begin
OpenDialog1.Filter :=
'所有支持类型(*.EXE,*.DLL,*.OCX,*.ICL,*.ICO,*.BMP)|*.exe;*.dll;*.ocx;*.icl;*.ico;*.bmp|所有文件(*.*)|*.*';
If OpenDialog1.Execute Then
Begin
Edit1.Text := OpenDialog1.Filename;
Icon_Index := 0;
Extract_Icon;
End;
Image1.Picture.Icon.SaveToFile(szFileName); //保存图标
End;

Procedure TForm1.FormShow(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1); //判断是否有参数
If ExeFile = '' Then
Begin
Close;
End;
End;

End.


q358535911 2011-01-04
  • 打赏
  • 举报
回复
要修改资源文件,难
zyp2524153 2011-01-04
  • 打赏
  • 举报
回复
再写一个程序,通过WinExec调用,调用的时候穿过去一个参数,即自己的绝对路径,然后通过另一个程序进行修改,我已经弄好了,要代码的话留邮箱.
Joe-xXx 2011-01-03
  • 打赏
  • 举报
回复
eXeScope 这个软件可以
abijiwei 2011-01-03
  • 打赏
  • 举报
回复
我只会右键属性修改,这个就有点晕了
hongkai210 2011-01-03
  • 打赏
  • 举报
回复
资源文件吧。
logygg 2011-01-03
  • 打赏
  • 举报
回复
http://hi.baidu.com/hltk520/blog/item/5cc247cd90f567570fb345d8.html
logygg 2011-01-03
  • 打赏
  • 举报
回复
http://hi.baidu.com/hltk520/blog/item/5cc247cd90f567570fb345d8.html
faux2002 2011-01-02
  • 打赏
  • 举报
回复
按也不直到
zhan7505201 2011-01-02
  • 打赏
  • 举报
回复
调用程序。
dinoalex 2011-01-02
  • 打赏
  • 举报
回复
是修改第三方的,还是自家写的?
appleshao 2011-01-01
  • 打赏
  • 举报
回复
EXE吗?直接用消息重画啊,多建几个资源文件,根据客户产生的消息ID重画
加载更多回复(72)

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧