Delphi – 嗨软 https://ihacksoft.com/archive 分享最好用的常用软件 Tue, 22 Nov 2022 02:41:09 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.26 Delphi查找进程代码 https://ihacksoft.com/archive/1286.html https://ihacksoft.com/archive/1286.html#comments Tue, 09 Aug 2011 01:59:03 +0000 https://ihacksoft.com/?p=2015
function CheckTask(ExeFileName: string): Boolean;
const
PROCESS_TERMINATE=$0001; ]]>
记得先在Uses中加入Tlhelp32单元。

function CheckTask(ExeFileName: string): Boolean;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := False;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =UpperCase(ExeFileName))) then
result := True;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

配合Delphi的结束进程代码,可以方便地监视进程和结束进程。

以查找QQ进程为例:
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckTask('qq.exe')=true then
KillTask('qq.exe')
else
Label1.Caption:='进程不存在,监视中...';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if CheckTask('qq.exe')=true then
Label1.Caption:='进程正在运行中...'
else
Label1.Caption:='进程不存在,监视中...';
end;

]]>
https://ihacksoft.com/archive/1286.html/feed 1
Delphi字符串截取函数LeftStr,MidStr,RightStr的用法 https://ihacksoft.com/archive/1285.html https://ihacksoft.com/archive/1285.html#respond Mon, 08 Aug 2011 15:14:07 +0000 https://ihacksoft.com/?p=2014 举例:假设字符串是 Dstr := 'Delphi is the BEST', 那么
LeftStr(Dstr, 5) := 'Delph'
MidStr(Dstr, 6, 7) := 'i is th'
RightStr(Dstr, 6) := 'e BEST' ]]>
这几个函数都包含在StrUtils中,所以需要uses StrUtils;
举例:假设字符串是 Dstr := 'Delphi is the BEST', 那么
LeftStr(Dstr, 5) := 'Delph'
MidStr(Dstr, 6, 7) := 'i is th'
RightStr(Dstr, 6) := 'e BEST'

但我并不建议在Uses中引入StrUtils的做法,会增加程序体积,要用到其中哪个函数,直接写个Function就OK了。

function RightStr
(Const Str: String; Size: Word): String;
begin
if Size > Length(Str) then Size := Length(Str) ;
RightStr := Copy(Str, Length(Str)-Size+1, Size)
end;
--------------------------------------
function MidStr
(Const Str: String; From, Size: Word): String;
begin
MidStr := Copy(Str, From, Size)
end;
--------------------------------------
function LeftStr
(Const Str: String; Size: Word): String;
begin
LeftStr := Copy(Str, 1, Size)
end;

这几个函数经常结合Pos,Length,Copy函数使用。

]]>
https://ihacksoft.com/archive/1285.html/feed 0
Delphi“选择文件夹”对话框代码 https://ihacksoft.com/archive/1284.html https://ihacksoft.com/archive/1284.html#respond Mon, 08 Aug 2011 14:54:51 +0000 https://ihacksoft.com/?p=2013   好久没写软件了,昨天下午试着写个小软件:QQ2011显IP显地理位置补丁。其中要涉及到如何让用户选择QQ安装路径下的Bin目录,这时就要用到Delphi“选择文件夹”对话框的代码,我的Delphi学习笔记里一时只找到选择某一文件的代码,于是去网上搜寻,找到了这段最简洁的代码:

uses FileCtrl;

var
  szPath: string;
if SelectDirectory('选择您QQ安装路径的Bin目录:','',szPath) then
Edit1.Text := szPath;

  亲测,非常好用!

]]>
https://ihacksoft.com/archive/1284.html/feed 0
Delphi中“Variable ‘Res’ might not have been initialized”的解决方法 https://ihacksoft.com/archive/1176.html https://ihacksoft.com/archive/1176.html#respond Wed, 27 Jan 2010 02:37:42 +0000 https://ihacksoft.com/?p=1905 [Warning] Unit1.pas(33): Variable 'Res' might not have been initialized
其实这只是个警告,对于程序运行是没有关系的,但是我想知道原因并且把它去掉。 ]]>
刚刚在用Delphi写一个五笔输入法安装程序,在导出资源这个过程中出现一个问题,就是编译的时候出现错误提示:

[Warning] Unit1.pas(33): Variable 'Res' might not have been initialized

其实这只是个警告,对于程序运行是没有关系的,但是我想知道原因并且把它去掉。

导出资源的源代码我是这样写的:

procedure ExtractRes(ResType, ResName, ResNewName: string);
var
Res: TResourceStream;
begin
try
Res:= TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
finally
Res.Free;
end;
end;

一、由于有try语句出现流程分支而出现的,把try...finally结构暂时注释调再编译警告就会消失。

二、警告的原因是有可能Res在Create方法时失败,这样Res.Free就会有异常,把
Res:= TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
放到try外面即可!

]]>
https://ihacksoft.com/archive/1176.html/feed 0
Delphi结束进程模块代码 https://ihacksoft.com/archive/1162.html https://ihacksoft.com/archive/1162.html#respond Wed, 06 Jan 2010 03:31:58 +0000 https://ihacksoft.com/?p=1891 以前写系统安全软件时经常要用到的,只是一个function而已,调用即可!调用方法下面也写了。注意,别忘了在uses里加入Tlhelp32单元。

uses
Tlhelp32;

function KillTask(ExeFileName:string):integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOLean;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(0),
FProcessEntry32.th32ProcessID),
0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

调用的时候只需要
if KillTask('qq.exe') <> 0 then
showmessage('结束QQ成功')
else
showmessage('无法结束QQ');

]]>
https://ihacksoft.com/archive/1162.html/feed 0
Delphi轻松获取系统进程名称和进程ID https://ihacksoft.com/archive/1067.html https://ihacksoft.com/archive/1067.html#respond Thu, 12 Nov 2009 07:54:18 +0000 https://ihacksoft.com/?p=1796
完整的源代码如下: ]]>
Delphi获取系统当前进程名和进程ID,这里我采用的是ListViw控件。要注意在编写本单元时,不要忘了引用“TLHelp32”单元。

完整的源代码如下:

var
  Form1: TForm1;
  Summ: Word;

implementation

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
var
  ContinueLoop: BOOL;
  NewItem: TListItem;
begin
  ListView1.Items.BeginUpdate;
  ListView1.Items.Clear;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  //CreateToolhelp32Snapshot函数得到进程快照
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  //初始化
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  //Process32First 得到一个系统快照里第一个进程的信息
  Summ := 0;
  while ContinueLoop do
    begin
    Summ := Summ + 1;
    NewItem := ListView1.Items.Add;   //在ListView1显示
    NewItem.ImageIndex := -1;
    NewItem.Caption := ExtractFileName(FProcessEntry32.szExeFile);//进程名称
    NewItem.subItems.Add(FormatFloat('00', Summ));//序号
    NewItem.subItems.Add(IntToStr(FProcessEntry32.th32ProcessID));//进程ID
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
  ListView1.Items.EndUpdate;
end;

亲自测试,完整无误!

]]>
https://ihacksoft.com/archive/1067.html/feed 0
Delphi编程基础学习系列—获取Windows系统目录 https://ihacksoft.com/archive/1066.html https://ihacksoft.com/archive/1066.html#respond Thu, 12 Nov 2009 03:08:28 +0000 https://ihacksoft.com/?p=1795
程序代码如下:
getwindowsdirectory(@win_dir,40);//获取Windows系统目录
getsystemdirectory(@sys_dir,40);//获取System32系统目录 ]]>
我以前刚开始学习Delphi编程时做的笔记,适合Delphi初学者。

程序代码如下:

Procedure TForm1.SpeedButton1Click(Sender: TObject);
var
win_dir,sys_dir:array[0..255] of char;
begin
getwindowsdirectory(@win_dir,40);//获取Windows系统目录
getsystemdirectory(@sys_dir,40);//获取System32系统目录
edit1.Text :=win_dir;
edit2.text :=sys_dir;
end;

稍微解释一下:
@放在变量面前,表示获取此变量所在的内存地址:
^在数据类型之前,表示定义一个指针类型;在指针后面,表示获取指针所指向的数据。

]]>
https://ihacksoft.com/archive/1066.html/feed 0
Delphi编程基础学习系列—创建与删除文件夹 https://ihacksoft.com/archive/1065.html https://ihacksoft.com/archive/1065.html#comments Thu, 12 Nov 2009 03:02:40 +0000 https://ihacksoft.com/?p=1794
Forcedirectories函数用于创建一个DIR参数指定的但系统中不存在的文件夹;
Rmidir函数用于删除一个参数指定的子目录。 ]]>
我以前刚开始学习Delphi编程时做的笔记,适合Delphi初学者。

Forcedirectories函数用于创建一个DIR参数指定的但系统中不存在的文件夹;
Rmidir函数用于删除一个参数指定的子目录。

//创建文件夹
Procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if(directoryexists(edit1.text))then
showmessage('文件夹已经存在!')
else
begin
if application.MessageBox(pchar('是否创建文件夹'+edit1.text),'操作提示',mb_yesno)=mryes then
begin
forcedirectories(edit1.text);
end;
end;
end;

//删除文件夹
Procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if (directoryexists(edit1.text)) then
  begin
  if application.MessageBox(pchar('是否删除文件夹'+edit1.text),'操作提示',mb_yesno)=mryes then
    begin
    rmdir (edit1.text);
    edit1.clear;
    end;
  end; 

运行结果
Delphi-Directory

]]>
https://ihacksoft.com/archive/1065.html/feed 1
Delphi编程基础学习系列—常用组件的属性(三)之消息框与输入框 https://ihacksoft.com/archive/1054.html https://ihacksoft.com/archive/1054.html#respond Tue, 10 Nov 2009 07:36:11 +0000 https://ihacksoft.com/?p=1783
Delphi提供两种内部对话框,信息对话框和输入对话框。下面分别一一讲解。

一、信息对话框使用过程Showmessage、Showmessagefmt、Messagedlg和Messagedlgpos。 ]]>
我以前刚开始学习Delphi编程时做的笔记,适合Delphi初学者。

Delphi提供两种内部对话框,信息对话框(如Showmessage、Showmessagefmt)和输入对话框(如Inputbox)。下面分别一一讲解。

一、信息对话框使用过程Showmessage、Showmessagefmt、Messagedlg和Messagedlgpos。

Showmessage过程显示一个最简单的对话框,其语法格式为:
Showmessage(信息内容);
说明:SHOWMESSAGE过程显示的对话框以应用程序的执行文件名作为标题,对话框只含有一个OK按钮,单击该按钮对话框即关闭并返回。
例如:showmessage('我爱Delphi!!')。
Delphi-Showmessage

Showmessagefmt语法格式为:
showmessagefmt(信息内容,参数组);
说明:此过程与上一个过程其本相同,只是参数多了格式化的字符。
例:showmessagefmt('%s今年%d岁了!',[edit1.text,strtoint(edit2.text)])。
%s的内容为edit1.text。
%d的内容为edit2.text。
比如:Showmessagefmt('%s今年%d岁了!',['伟伟',21]),弹出对话框“伟伟今年21岁了!”。

MessagedlgMessagedlgpos
这两个函数可以显示一个信息对话框,并等待用户的响应。

Messagedlg函数
语法格式为:变量名:=MESSAGEDLG(信息内容,类型,按钮组,HELPCTX);
说明:
信息内容是显示在对话框中的信息.
类型是对话框的类型,其取值有:
mtwarning含有感叹号的警告对话框.
Mterror含有红色叉符号的错误对话框.
Mtinfomation含有蓝色I符号的信息对话框.
Mtconfirmation含有绿色?号的确认对话框
Mtcustiom不含图标的一般对话框,对话框的标题是程序的名称.
按钮组指定对话框中出现的按钮组,其中出现的按钮与参数有:
MBYES YES按钮,函数返回值为:6。
MBNO NO按钮,函数返回值为:7。
MBOK OK按钮,函数返回值为:
MBCANCEL CANCEL按钮,函数返回值为:2。
MBHELP HELP按钮。
MBABORT ABORT按钮,函数返回值为:3。
MBRETRY RETRY按钮,函数返回值为:4。
MBIGNORE IGNORE按钮,函数返回值为:5。
MBALL ALL按钮,函数返回值为:8。
MBNOTOALL NOTOALL按钮,函数返回值为:9。
MBYESTOALL YESTOALL按钮,函数返回值为:10。
按钮组可以组成某种形式,如[MBYES,MBNO]表示对话框中出现两个按钮:”YES”和”NO”。也可以常量形式如MBOKCANCEL表示对话框中出现两个按钮:”OK”和”CANCEL”。

举个例子,如密码框:

procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
begin
if  edit1.text='hqw'  then
    showmessage('密码正确,欢迎进入!')
else
    begin
    x:=messagedlg('密码错误,请重新输入!',mterror,[mbyes,mbno],0);
    if  x=6 then  //x为6即代表用户点击的是确定按扭。
     begin
      edit1.text:='';//清空。
      edit1.SetFocus;//设置焦点。
      end
     else
       close;
     end;
end;

Delphi-Messagedlg
Delphi-Messagedlg

Messagedlgpos函数
调用MESSAGEDLGPOS函数,可以屏幕的指定位置显示信息对话框,其语法格式为:
变量=MESSAGEDLGPOS(信息内容,类型,按钮组,,HELPCTX,X,Y);
它比MESSAGEDLG只是多了一项功能,即具有X,Y显示位置坐标。

二、输入对话框使用函数Inputbox和Inputquery函数

Inputbox的作用为显示一个输入对话框。
其格式为:变量:=INPUTBOX(对话框信息,信息内容,默认内容);
对话框信息为指定对话框的标题。
信息内容为指定在对话框上出现的文本。
默认内容为在出现对话框时自动出现的输入内容。

Inputquery与Inputbox相似只出现一个输入框。只是对CANCEL按钮(退出事件)另作处理,将返回一个布尔值。
其格式为:变量:=INPUTQUERY(对话框标题,信息内容,字符串变量);
在出现对话框时如果单击OK输入框中的值将赋值到变量中,并且函数返回True;若用户单击Cancel按钮,变量值不变并返回False,可以根据返回值的不同作出判断。

举个例子,代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  x:integer;
begin
   x:=strtoint(inputbox('提示','请输入求和值','0'));
   if  x=strtoint(edit1.Text)+strtoint(edit2.Text) then
       edit3.Text:='正确'
   else
       edit3.Text:='错误';
end;

运行之后的如下图:
Delphi-Inputbox
Delphi-Inputbox

]]>
https://ihacksoft.com/archive/1054.html/feed 0
Delphi初学者也来编写IE弹窗插件 https://ihacksoft.com/archive/1052.html https://ihacksoft.com/archive/1052.html#respond Mon, 09 Nov 2009 03:01:13 +0000 https://ihacksoft.com/?p=1781   以前我用Delphi写过的一个IE弹出插件,好像很多黑友都比较喜欢,纷纷转载了。代码还是很简洁的,而且我都做了解释,就算Delphi初学者也能看得懂,喜欢的朋友就拿去吧!

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  reg:tregistry;
  hwnd:thandle;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//application.showmainform=false //隐藏窗体。这里是演示,就不隐藏了。
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true); //true应该是覆盖。
reg.writestring('scanregistry','ad.exe');     //以上三行就是写入注册表的启动项。
reg.closekey;
reg.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
hwnd:=findwindow('IEframe',nil);//调用Findwindow函数来查找浏览器是否运行。
if hwnd<>0 then //如果浏览器正在运行,那么...
shellexecute(0,'open','iexplore.exe','http://www.hack0573.com','',SW_SHOWNORMAL);
//打开www.hack0573.com这个网站,这里shellexecute的用法跟VB的一样。
end;

end.

]]>
https://ihacksoft.com/archive/1052.html/feed 0