大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 利用WinAPI写小执行程序

利用WinAPI写小执行程序

时间: 2021-07-31 作者:daque

象c谈话一律,用delphi也能写出惟有几十k、十几k、以至惟有几k的小步调,正文将一个能将win95桌面藏起来的仅有38k的小步调为例教会读者群这一本领,同声正文还波及win95 trayicon的表露。  本步调能写得很小的窍门是:基础没有效任何的 form 。也即是说,源步调惟有一个desktop.dpr 文献,步调实足用规范的 winapi 写成,因为用到的资源很少,以是步调的体积也很小。固然,用如许的本领编制程序时不许运用 delphi的所见即所得的编制程序办法。 {开始看看步调头的写法:}  program deskpop;  uses windows, messages, shellapi, sysutils;  {$r *.res}  {不妨看出本步调比普遍的 delphi 步调用到的 unit 少的多。 底下声领会全部恒量和变 量,姑且不妨 尽管她们。}  const  appname = 'desktop hide';  var  x: integer;  tid: tnotifyicondata;  wndclass: array[0..50] of char;  {此刻加入步调的重要局部,开始是设置了一批进程,为了能让读者群更好地领会,咱们先 把那些进程跳过 去,先说主步调。主步调坐落步调的结果,如许做的长处是不妨径直运用步调中设置的进程。主步调格外 大略:}  begin  winmain;  end.  {可见一切的处事都由 winmain 实行了。这个 winmain 运用规范的 winapi 因变量举行编 程,重要办法 是:先证明一个窗口类,而后创造一个主窗口,结果加入动静轮回,直到步调中断。}  procedure winmain;  var  wnd: hwnd; {证明窗口句柄(handle)变量}  msg: tmsg; {证明动静变量}  cls: twndclass; {窗口类变量}  begin  { previous instance running ? if so, exit }  { 查看能否步调仍旧运转,即使仍旧运转则挪用panic进程退出 }  if findwindow (appname, nil) <> 0 then  panic (appname + ' is already running.');  { register the window class }  { 这边的备案窗口类步调是官样文章,照抄即可}  fillchar (cls, sizeof (cls), 0); {用这一句将窗口类变量cls清零)  cls.lpfnwndproc := @dummywindowproc; {取回调因变量dummywindowproc的地方}  cls.hinstance := hinstance; {范例句柄}  cls.lpszclassname := appname; {窗口类名}  registerclass (cls); {备案窗口类cls}  { 此刻不妨创造步调的主窗口了-在本步调中是个假造窗口}  { now create the dummy window }  wnd := createwindow (appname, appname, ws_overlappedwindow, cw_usedefault, cw_usedefault, cw_usedefault, cw_usedefault, 0, 0, hinstance, nil);  x:= 0; {变量x本来是个电门变量,记载此刻能否仍旧湮没了桌面}  { 即使窗口创造胜利,则表露窗口,并加入动静轮回 }  if wnd <> 0 then  begin  showwindow (wnd, sw_hide);{本例中窗口是湮没的}  { 底下加入动静轮回,该轮回将连接运转直到 getmessage归来0 }  while getmessage (msg, 0, 0, 0) do  begin  translatemessage (msg);  dispatchmessage (msg);  end;  end;  end;  {此刻可见,步调的主框架很领会,然而它还不许实行任何工作。进程 panic将表露一个对话框畏缩出步调,它在 winmain 进程的发端局部被挪用,本来 panic的功效很大略,之以是要写成一 个因变量的因为恐 怕一上面是构造化编制程序的须要,另一上面借此避开了 string和 pchar 的变换。}  procedure panic (szmessage: pchar);  begin  if szmessage <> nil then messagebox (0, szmessage, appname, mb_ok);  halt (0);  end;  {底下是回调(callback)因变量 dummywindowproc,即使说 winmain 进程是本步调-大概说是本运用或实 例的人命,那么这个回调因变量不妨说是主窗口的精神。每一个规范的大概说是典型的 windows窗口都有一 个回调因变量,以处剪发给该窗口的动静。所谓“回调”的道理是这个因变量不是由步调径直 挪用的,而是由 windows 体例挪用(还牢记咱们在窗口类中给lpfnwndproc赋过值吗), 这即是事变启动编制程序。}  function dummywindowproc (wnd: hwnd; msg, wparam: word; lparam: longint) : longint; stdcall; {提防这边有一个 stdcall;设置了回调因变量}  var  trayhandle: thandle;  dc: hdc;  i: integer;  pm: hmenu;  t: tpoint;  begin  dummywindowproc := 0;  {底下两句是找到 win95 工作栏的句柄}  strpcopy(@wndclass[0], 'progman');  trayhandle := findwindow(@wndclass[0], nil);  {底下发端处置动静}  case msg of  {收到窗口创造动静 - 在工作栏上表露一个图标}  wm_create: // program initialisation - just set up a tray icon  begin  tid.cbsize := sizeof (tid);  tid.wnd := wnd;  tid.uid := 1;  tid.uflags := nif_message or nif_icon or nif_tip;  tid.ucallbackmessage := wm_user;  tid.hicon := loadicon (hinstance, 'mainicon');  lstrcpy (tid.sztip,'desktop is on');  shell_notifyicon (nim_add, @tid);  end;  wm_destroy: {收到封闭窗口动静时的处置}  begin  shell_notifyicon (nim_delete, @tid);  postquitmessage (0);  showwindow(trayhandle, sw_restore);  end;  {收到菜单动静时挪用 handlecommand 进程,并退出因变量}  wm_command: // command notification  begin  handlecommand (wnd, loword (wparam));  exit;  end;  {收到其余用户动静时的处置}  wm_user: // had a tray notification - see what to do  {即使单击了鼠标左键, 则翻开或封闭桌面}  if (lparam = wm_lbuttondown) then  begin  if x = 0 then  begin  showwindow(trayhandle, sw_hide);  tid.hicon := loadicon (hinstance, 'officon');  lstrcpy (tid.sztip,'desktop is off');  shell_notifyicon (nim_modify, @tid);  x:=1  end else  begin  showwindow(trayhandle, sw_restore);  tid.hicon := loadicon (hinstance, 'onicon');  lstrcpy (tid.sztip,'desktop is on');  shell_notifyicon (nim_modify, @tid);  x:= 0;  end; {end of if}  end else  {即使是鼠标右键,则动静天生一个弹出式菜单}  if (lparam = wm_rbuttondown) then  begin  getcursorpos (pt);  pm := createpopupmenu;  appendmenu (pm, 0, ord ('a'), 'about desktop hide...');  appendmenu (pm, mf_separator, 0, nil);  appendmenu (pm, 0, ord ('e'), 'exit desktop hide');  setforegroundwindow (wnd);  dc := getdc (0);  if trackpopupmenu (pm, tpm_bottomalign or tpm_rightalign,pt.x,getdevicecaps(dc,horzres){pt.y}, 0, wnd, nil) then setforegroundwindow (wnd);  destroymenu (pm)  end; {end of if}  end; {end of case}  {在处置过动静之后,还要挪用默许因变量,以实行规范的windows步调该当实行的工作,所 以这一句特殊要害}  dummywindowproc := defwindowproc (wnd, msg, wparam, lparam);  end;  {这个即是处置菜单动静的进程}  procedure handlecommand (wnd: hwnd; cmd: word);  begin  case cmd of  ord ('a'): messagebox (0, 'freeware brian.slack@strath.ac.uk 1997', appname, mb_ok);  ord ('e'): postmessage (wnd, wm_close, 0, 0);  end;  end;  至此咱们仍旧实行了这个惟有38k的能将win95桌面湮没起来的步调,只有将正文中一切的因变量和进程的程序颠倒,并将主步调放到结果,即可编写翻译经过。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.