delphi实现纯API可视EXE模板  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi实现纯API可视EXE模板


《Delphi 7 经典问题解析》里一个可参考的例子,实现无VCL版可视窗体的构建。其实这在本人前篇文章《我的第一个偏移量补丁》里已有相关实现方法,不过那是用资源文件方式生成,而这个却完全是用纯代码编写,编译运行后界面如下,比较简单,但UPX压缩后才20.5K,呵呵,正是用来做注册机的好材料 ~~

program SmallExe;

uses
SysUtils,
Windows,//这个单元必须要加入
Messages; //这个单元必须要加入

var
WinClass: TWndClassA;
Inst, Handle, Button1, Label1, Edit1: Integer;
Msg: TMsg;
hFont: Integer;

procedure CheckPassword;//定义一个检查用户输入的密码是否正确的过程;
var
Text: PChar;
Textlength: Integer;
begin
    TextLength := GetWindowTextLength(Edit1);
    GetMem(Text, TextLength + 1);
    GetWindowText(Edit1, Text, TextLength + 1);//利用API函数取得用户输入的密码;
    if (Text = 'caoyang') then
    begin
      MessageBoxA(Handle, '密码输入正确,恭喜您,您已经完成了登陆认证!','密码检查', MB_OK);
      FreeMem(Text, TextLength + 1);
      Halt;
      Exit;
    End
    Else
      MessageBoxA(Handle, '密码输入不正确,请重新输入.', '密码检查', MB_OK);
end;

function WindowProc(hWnd, uMsg, wParam, lParam:Integer):Integer;stdcall;
//这里定义了一个过程类型的具体兼容实现,实际上是一个回调函数
begin

//反复循环检测消息队列,给uMsg,wParam,lParam赋值
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);

//当收到点击按钮的消息的时候,调用CheckPassword过程来检查用户的输入是否正确
if (lParam = Button1) and (uMsg = WM_COMMAND) then
    CheckPassword;

//如果收到销毁窗体的消息,则利用Halt语句释放所有的资源
if (uMsg = WM_DESTROY) then   
Halt;
end;

//下面的部分是程序的主体
begin
{ ** 注册用户自己的窗口类 ** }
Inst := hInstance;
with WinClass do
begin
    style              := CS_CLASSDC or CS_PARENTDC;
    lpfnWndProc        := @WindowProc;
    hInstance          := Inst;
    hbrBackground      := color_btnface + 1;
    lpszClassname      := 'AG_TESTWINDOW';
    hCursor            := LoadCursor(0, IDC_ARROW);
end;
RegisterClass(WinClass);

{ ** 创建主窗体 ** }
Handle := CreateWindowEx(WS_EX_WINDOWEDGE, 'AG_TESTWINDOW', '用Windows API编写程序演示',WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
                                     363, 278, 305, 65, 0, 0, Inst, nil);
{ ** 创建一个按钮 ** }
Button1:=CreateWindow('Button', '确认', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,216, 8, 75, 25, handle, 0, Inst, nil);

{ ** 创建一个静态文本标签 ** }
Label1 := Createwindow('Static', '请输入密码:', WS_VISIBLE or WS_CHILD or SS_LEFT,8, 12, 76, 13, Handle, 0, Inst, nil);

{ ** 创建一个编辑框 ** }
Edit1:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0, Inst, nil);

{ ** 创建字体句柄 ** }
hFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

{ 改变字体 }
if hFont <> 0 then
begin
    SendMessage(Button1, WM_SETFONT, hFont, 0);
    SendMessage(Label1, WM_SETFONT, hFont, 0);
    SendMessage(Edit1, WM_SETFONT, hFont, 0);
end;

{把输入焦点放在编辑框中 }
   SetFocus(Edit1);

   UpdateWindow(Handle);

{ ** 消息循环检测 ** }
while(GetMessage(Msg, Handle, 0, 0)) do
begin
    TranslateMessage(msg);//翻译消息的类型
    DispatchMessage(msg);//分发消息给相应的处理例程
end;

end.


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.044661998748779 seconds