作者在开发个人软件“视窗超人”时,较多地应用了Win32API,现在VB开发环境下调用举例,与大家交流经验。
1.拖动无标题的窗体
第一种方法移动时窗口不显示窗口内容,即在移动时只显示虚框
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF012
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture'释放鼠标捕获
SendMessage hwnd, WM_SYSCOMMAND, SC_MOVE, 0'发送窗口移动消息
End Sub
第二种方法移动时窗口显示窗口内容,即如同移动一个实体,(如您的窗口风格有标题栏,此代码对窗口位置的定位将有偏差,请作局部调整)
在Load 事件或运行前将窗口的ScaleMode设为3 即用像素作内部度量单位
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim MousePoint As POINTAPI, MouseSize As POINTAPI
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
SetCapture (hwnd)'设置鼠标捕获
Tag = "1" '将其作为移动标志
MouseSize.X = X
MouseSize.Y = Y
'记忆鼠标按下时的光标位置
End If
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Tag = "1" Then
Call GetCursorPos(MousePoint)'返回鼠标在屏幕中的位置
Left = Screen.TwipsPerPixelX * (MousePoint.X - MouseSize.X)
Top = Screen.TwipsPerPixelY * (MousePoint.Y - MouseSize.Y)
'设置窗口位置
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Tag = ""
ReleaseCapture '释放鼠标
End Sub
VB和Delphi有颇多相似,二者代码可轻易转换作对方,现再以Delphi建立系统栏图标举几个API的例子,并且包括自定义消息和对系统消息的自定义处理,如果您想追求更小的exe和更了解系统而不是使用别人封装过的控件,请看以下举例
2.系统栏图标处理
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,
ExtCtrls, shellapi;//在引用中加入shellapi
Const wm_MyCall = wm_User+$1000;//自定义消息
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure wndProc(var Msg: TMessage) ; override;
procedure FormDestroy(Sender: TObject);//重载并处理自定义消息的模块
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Ico : TNotifyIconData;//声明一个实例
implementation
{$R *.DFM}
procedure SysTrayIco(msgs:Dword;icos:Ticon=Nil);//处理任务栏图标过程
begin
if icos=nil then//如果为缺省空值,表示要从系统栏删除此图标
Shell_NotifyIcon(nim_Delete,@ico)
else
begin
With ico do//加入TrayIcon
Begin
cbSize := SizeOf(Ico); //初始化大小为实例大小
Wnd := form1.handle; //有效窗口句柄
uID := 0; //一个应用程序在系统
uFlags := nif_Icon Or NIF_MESSAGE Or nif_Tip;//设定有效域为图标、消息和提示
uCallBackMessage := wm_MyCall; //对应的消息处理
hicon:=icos.handle; //图标
lstrcpy(szTip,'左键弹出系统菜单,右键更改图标');//设定点鼠标经过时的提示
Shell_NotifyIcon(msgs,@Ico);
End;
end;
end;
procedure Tform1.wndProc(var Msg: TMessage) ;//重载并自定义消息
var MousePoint:TPoint;CurrentTime,DelaySecond:real;
begin
GetCursorPos(MousePoint); //得到当前鼠标位置
with msg do
begin
if msg =wm_MyCall then//如是自定义消息
Begin
DelaySecond:=GetDoubleClickTime();//得到鼠标双击的最大时间间隔
case LParam of
WM_LBUTTONDBLCLK: //双击
begin
tag:=1; //发生双击时,此处代码重入并使单击条件为假
messagebox(handle,'这是双击处理','加入代码吧',mb_ok);
SendMessage(Handle, WM_CLOSE, 0, 0)
end;
wm_LButtonDown: //单击
begin
currenttime:=gettickcount; //得到当前开机时间
while ((gettickCount)<(currentTime+delaySecond)) and (tag=0) do
application.ProcessMessages;
//如果在发出双击的有效时间内未双击,则执行单击,可将tag看作为是否双击的bool变量,此循环是时钟控件的代替物,也可在单击时激活一个时钟,若时钟尚未触发时又发生双击事件,则关闭时钟,执行双击代码,否则在时钟触发时执行单击代码,这样可很好地避免一个双击动作对一单一双两条消息的处理
if tag=0 then TrackPopupMenu(GetSystemMenu(handle,false),tpm_BottomAlign or tpm_RightAlign,MousePoint.x,MousePoint.Y,0,handle,nil);//弹出系统菜单,在单击事件时的鼠标位置
tag:=0;
end;
wm_RButtonDown: SysTrayIco(nim_Modify,application.Icon);//修改系统栏图标
End;
end
else
if WParam =SC_MINIMIZE then messagebox(handle,'将要最小化','截获系统消息',MB_OK);//可用此方法截获发给窗口的全部消息,以自定义处理过程
end;
inherited wndProc(Msg); //继续未被处理的消息
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SysTrayIco(nim_Add,icon);//建立系统栏图标
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SysTrayIco(nim_Delete);//退出时系统栏删除图标
end;
end.
以上是一段较多运用Api的代码,API调用有:
Shell_NotifyIcon(对系统任务栏图标的操作); GetCursorPos(得到当前鼠标位置); GetDoubleClickTime(得到鼠标双击的最大时间间隔); messagebox(消息对话框);gettickcount(得到当前开机时间); TrackPopupMenu(弹出菜单); GetSystemMenu(得到系统菜单句柄)和通过SendMessage关闭窗口
分享到:
相关推荐
"PB API调用例子"则是针对如何在PowerBuilder中正确地调用Windows API进行实践操作的示例代码。这些例子通常会展示如何声明API函数、如何传递参数以及如何处理返回值,帮助开发者理解API调用的过程。 首先,调用...
### Win32 API调用详解 #### 一、概述 Windows API(Application Programming Interface),即Windows应用程序编程接口,是微软Windows操作系统提供的一组标准应用程序接口集合。这些API函数构成了构建Windows应用...
3. 示例API调用:主程序中可能有一个或多个调用被Hook的API函数的例子,以展示Hook的效果。 在实践中,你可以通过以下步骤学习和使用这个例子: 1. 解压"APIHook"压缩包,查看项目结构和源代码。 2. 理解和分析Hook...
API调用的过程通常包括以下几个步骤: 1. **导入库或头文件**:在大多数编程语言中,使用API前需先导入相应的库或包含头文件。这使得代码可以访问API提供的函数和数据结构。 2. **函数声明**:头文件中包含了API...
压缩包中的文件名列表提到了几个文档,它们可能涵盖了不同的API调用示例,如内存操作、窗口和进程通信等。这些主题都是C#调用Windows API时常见的应用场景,通过深入学习这些文档,开发者可以掌握更多的技能和技巧,...
制作API钩子在Delphi中通常涉及到以下几个关键步骤: 1. **选择钩子类型**:Windows API提供了多种钩子类型,如WH_CALLWNDPROC、WH_GETMESSAGE等,每种类型对应不同的钩子事件。对于截获API调用,我们通常选择`WH_...
在Delphi中,实现API钩子通常涉及到以下几个关键步骤: 1. **定义钩子函数**:首先,我们需要定义一个回调函数,这个函数将在API被调用时执行。回调函数的原型应与被钩住的API相符,以便能够接收和处理相同的参数。...
在游戏开发中,调用API(应用程序接口)通常涉及以下几个关键知识点: 1. **游戏引擎与API交互**:QQ华夏可能使用了自定义的游戏引擎,开发者通过调用引擎提供的API来实现游戏逻辑、图形渲染、物理模拟等功能。理解...
API Hooking的核心思想是通过插入代码(通常是一个函数指针或跳转指令)来改变API调用的正常流程。当目标程序调用被钩子的API时,控制流会被导向到开发者设定的处理函数,而不是直接到达原始API。处理函数可以执行...
提到的"易语言调用例子",这可能是"可可网络验证9.3版"针对易语言这一编程环境提供的示例代码。易语言是一种简单易学的中文编程语言,其语法简洁明了,适合初学者和快速开发。通过这个例子,开发者可以学习如何在...
**BPS远程调用例子详解** BPS(Business Process Server)是一种流程管理工具,它允许开发者设计、执行和监控业务流程。在这个例子中,我们主要关注如何通过BPS的Java API进行远程调用来操作服务器上的流程实例。...
1. **错误处理**:了解并处理API调用可能出现的错误,如网络异常、请求超时等。 2. **性能优化**:合理缓存数据,减少不必要的网络请求,提升应用性能。 3. **权限申请**:在Android系统中,需要获取相应的权限才能...
这个过程通常包括以下几个关键知识点: 1. **API的使用**:API是开发者用来访问和控制操作系统或应用程序功能的接口。在这个例子中,API允许程序与摄像头硬件进行交互,如开启摄像头、调整摄像头设置、捕获图像等。...
在实际应用中,这些功能通常会与JavaScript结合,以便在网页环境中触发FlashPaper的API调用。通过JavaScript,开发者可以响应用户的交互事件,如点击按钮,然后调用相应的FlashPaper API方法。例如,创建一个“查找...
本压缩包文件"**C#调用Win32类库几个例子.rar**"提供了一些示例,帮助开发者了解如何在C#中调用Win32 API来实现特定任务。 首先,让我们理解什么是Win32 API。Win32 API是微软Windows操作系统提供的函数库,包含了...
APIHOOK是一种技术,用于拦截和修改应用程序调用操作系统API(应用程序编程接口)的行为。...通过理解和应用这个APIHOOK的例子,你可以更好地理解Windows钩子机制,并且能够根据需求创建自己的API拦截解决方案。
这个例子中,`GetSystemTime()`返回一个包含10个元素的元组,分别代表年、月、日、小时、分钟、秒、毫秒、星期几、时区偏移和夏令时状态。 通过win32API,Python开发者可以访问到更多Windows系统级别的功能,实现更...
在这个例子中,我们可能涉及到以下几个关键知识点: 1. **BPS客户端API**:普元BPS提供了Java API,允许开发者在应用程序中调用BPS服务。这些API包括启动流程、查询流程实例、获取任务列表、完成任务等功能,是...