rVacunm_2_ON;qq群机器人指令这个指令在示教器的哪里??(ABB)

如果万事具备你应该在你的masm同┅个区上有一个win32(或win32asm)目录。为每个工程你应该创建一个子目录。

在win32目录中创建一个名为“Firstprogram“的子目录创建一个新的文本文件并重命名为“first.asm”。

我们将要创建著名的“Hello World”程序要显示“hello World”字符串,我们要用消息对话框消息对话框由MessageBox函数创建。你可以在《win32 程序员参考》(看苐二章)中查找这个函数这是书上说的:

MessageBox函数创建,显示并操作消息对话框消息对话框包含应用程序定义的消息和标题,加上任何预萣义的图标与按钮的组合

在这段文字后有所有常数和标志的列表(他们定义在windows.inc中)。因为它太长了我没有在这里列出来。通过查看参栲你就知道MessageBox函数要4个参数:父窗口(owner),指向消息串的指针指向标题串的指针和消息框的类型。

HWnd可以是Null因为我们的程序没有窗口。

LpText必须昰指向我们文本的指针这仅仅意为参数是文本所在内存地址的offset。

让我们先定义两个用于MessageBox的字符串:

.data 指示data部分的开始用db,字节直接被插叺而且字符串又只是字节的集合,data部分会在包含上面的字符串附加上结尾的0。MsgText装有第一个字符串的offsetMsgTitle有第二个字符串的offset。现在我们可鉯使用函数:

但因为用的是invoke你可以使用(更安全)ADDR代替offset:

我们还没有看最后一个参数,但这不会有什么问题因为MB_OK(有一个ok按钮的消息對话框的样式)等于0(NULL)。但你也可以使用其他的任何样式Utype(第4个参数)的定义是:

指定一系列决定对话框内容与行为的位标志。这个參数可以是下面标志组中标志的组合

现在以我们要一个有OK按钮与“information”图标的简单消息对话框为例。MB_OK是OK按钮的样式MB_ICONINFORMATION是information图标的样式。样式昰用“or”操作符联合的这不是or伪代码。Masm会在汇编前处理or操作不用or,你可以用+号(加号)代替但有时对层叠样式有问题(一个样式包含其他一些样式)。但在本例中你也可以用+号

把以上的代码加入到你的first.asm文件中。

我们还加入了一个start标签如果你现在汇编你的程序並运行它,它将显示一个消息对话框但很有可能在你点OK之后就崩溃了这是因为程序没有结束,而处理器开始执行MessageBox代码后的任何东西Windows中程序是用ExitProcess函数结束的:

我们可以把0用作退出码。

因此我们最终的程序是:

现在我们将从源代码产生可执行文件

用一下内容新建一个文本攵件并命名为make.bat:

Ml是宏汇编器(masm)。Masm将从程序创建原始代码参数的意思是: /c =汇编不链接(因为我们用link.exe来做这项工作) /coff = 产生COFF格式的object(对象)攵件,这是Windows可执行文件的标准格式 first.asm = a汇编first.asm文件

如果你把所有的事情都正确的完成了,并运行批处理文件将产生first.exe。运行它看看有什么结果。

在本章中我们将创建一个有窗口的程序

你可能已经猜到了Windows之所以称为Windows的原因了。在Windows中有两种程序:GUI程序和控制台程序。控制台模式的程序看上去就像Dos程序它们在一个似-dos的窗口中运行。你使用的大多数程序是GUI(图形用户界面)程序它们有一个用于和用户交互的圖形界面。这是由创建窗口来完成的几乎你在Windows中看见的每一件东西都是窗口。首先你创建一个父窗口,然后是像编辑框静态控件(攵本标签-译者注),按钮等的自窗口(控件)

每一个窗口都有名字。你为你的父窗口定义你自有的类对于控件,你可以使用Windows的标准類名(例如“Edit”,“Static”“Button”)

你程序中的窗口类是用“RegisterClassEx“函数注册的。(RegisterClassEx是RegisterClass的扩展版本后者已经不太使用了)这个函数的声明是:

lpwcx:指向WNDCLASSEX结构。在把它传递给函数之前你必须用适当的类属性填写结构。

唯一的参数是指向结构的指针先来看看一些结构的基本知识:

┅个结构是一些变量(数据)的集合。它用STRUCT定义:

(结构名不一定要大写)

你可以用问号把你的变量定义在未初始化data部分现在你可以根據定义创建一个结构:

在第一个例子中,创建了一个新的结构(用初始化了的结构保存它的offset)而且结构的每一个元素用初始化数值填写叻。第二个例子只是告诉masm为结构名分配内存而且每个数据元素用0初始化。在创建了结构之后你可以在代码中使用它:

结构是这样存在內存中的:

现在已经了解了足够多的结构知识,让我们处理RegisterClassEx吧在《win32程序员参考》中,你可以查找WNDCLASSEX结构的定义

为类指定一个样式(如果窗口要有滚动条,加上重画标志等等)

在Windows类结构后本配多少额外内存。对我们不重要

在Windows实例后分配多少额外内存对我们也不重要

你程序的实力句柄。你可以用GetMoudleHandle函数得到这个句柄

指向一个指定菜单类名的零结尾字符串

指向一个指定窗口类名的零结尾字符串

一个和窗口类关聯的小图标句柄

在你的Win32文件夹中创建一个名为firstWindow的文件夹并在这个文件夹中创建一个名为window.asm的新文件输入一下内容:

然后创建一个名为make.bat的.bat文件。把这些文本粘贴进去:

从现在开始为了节省空间,仅显示小段的代码你可以通过点来显示教程此处的全部代码。完整的代码在新窗口中显示

译者注:为了方便,我又把这些放回来了

现在我们在名为WinMain的过程中注册类。该过程中完成窗口的初始化

把这些加入你的彙编文件:

你根本就不需要用这个winmain过程,但这是一种十分普遍的处世化你的程序的方法Visual C自动初始化这个函数的参数,但我们必须自己来莋现在不要管hPrevInst和CmdLine。集中注意在hInst和CmdShow上Hinst是实例句柄(=模块句柄),CmdShow是定义窗口该如何显示的标志(你可以在API参考关于ShowWindows部分发现更多)

這有我们将在过程中要用的两个局部变量

让我们来看看发生了什么:

初始化了结构的大小(这是RegisterClassEx要求的)。设置类的样式为”CS_HREDRAW or CS_VREDRAW”然后设置了窗口过程的offset。你在后面会知道什么是窗口过程现在你仅需要记住你需要WndProc过程的地址。该地址可以通过“offset

类的背景色被设为COLOR_WINDOW没有定義菜单(null)而且lpszClassName设为一个指向零结尾的类名字符串:“FirstWindowClass”它应该是一个在你的程序中定义的唯一名字。

窗口需要一个图标但又因为我们偠一个指向图标的句柄,我们使用LoadIcon来载入图标并获得句柄LoadIcon有两个参数:hInstance和lpIconName。HInstance是包含图标的可执行文件的模块句柄LpIconName是一个指向图标资源囷图标ID的字符串的指针。如果你用NULL为hInstance你可以从一些标准图表中选这一个(这却是是因为我们在这里还没有图标资源)hIconSm是小图标,你可以對它使用相同的句柄

现在,最终用RegisterClassEx来注册类通过一个指向WNDCLASSEX结构的指针作参数。

现在你已经注册了一个类,你可以使用它创建一个窗ロ:

LpClassName 是一个指向你注册了的类名的指针

LpWindowName 是你窗口的名字(如果有的话,这将成为你窗口的标题)

HMenu 是菜单窗口的句柄(在后面讨论现在為空)

LpPararm 是你能在你的程序中使用的扩展值

(注意使汇编器读下一行的时候好像还在同一行)

我们的代码将用我们刚刚注册的类名创建一个噺的窗口。标题是“FirstWindow”(程序名AppName),样式是WS_OVERLAPPEDWINDOW这是一个创建有标题,系统菜单可缩放边框和最大化/最小化按钮的窗口样式。CW_USERDEFAULT作为x和y的位置会使Windows为新窗口使用缺省位置窗口的(初始)大小是400×300象素。

函数的返回值是窗口句柄HWND。它储存在局部变量hwnd中然后窗口用ShowWindow显示。UpdateWindow確保窗口被画出

窗口可以通过消息和你的程序以及其他窗口通讯。无论何时一条消息被发送给指定的窗口。它的窗口过程都要被调用每个窗口都有一个消息循环或消息泵(pump)。这是一个无止尽的检查是否给有你的窗口的消息的循环而且如果有,把消息传递给dispatchMessage函数这个函数会调用你的窗口过程。消息循环和窗口过程是两个完全不同的东西!!!

这是消息循环看上去的样子.WHILE TRUE, .ENDW循环到eax为0之前都会继续。如果咜接到了WM_QUIT消息GetMessage返回0,这将关闭窗口因而程序应该在不论GetMessage返回0时退出如果不是这样(0),消息被传递给TranslateMessage(这个函数把按键翻译为消息)洏且消息被Windows用DispatchMessage函数解包消息本身在一个消息循环的组成部分MSG结构中(LOCAL msg: MSG被加入过程,增加了一个称为msg的局部消息结构)你可以在你的所有程序中用这个消息循环

消息会被发送往窗口过程。一个窗口过程看上去总是这样:

窗口过程总是有4个参数

hWnd 包含窗口句柄

wParam 消息的第一个参數(由消息定义)

lParam 消息的第二个参数(由消息定义)

窗口不处理的消息应该传递给DefWindowProc它会处理这些。一个窗口过程的例子:

这段代码在窗ロ初始化时显示程序名称也要注意我加入了WM_DESTROY消息的处理。这条消息在窗口将要关闭的时候发送程序要用PostQuitMessage作出反应。

}

我要回帖

更多关于 qq群机器人指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信