Win32API三两事

合集下载

Win32API函数大全使用详解

Win32API函数大全使用详解

一、窗口函数(Window)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == =AdjustWindowRect函数功能:该函数依据所需客户矩形的大小,计算需要的窗日矩形的大小。

计算出的窗口矩形随后可以传递给CreateWindow函数,用于创建一个客户区所需大小的窗口。

函数原型:BOOL AdjustWindowRect(LPRECT lpRect ,DWORDdwStyle,BOOL bMENU);参数:lpRect:指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。

函数返回时,该结构容纳所需客户区域的窗口的左上角和右下角的坐标。

dwStyle:指定将被计算尺寸的窗口的窗口风格。

bMenu:指示窗口是否有菜单。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

获取错误信息,参看GetLastError。

备注:客户矩形是指完全包含一个客户区域的最小矩形;窗日矩形是指完全包含一个窗口的最小矩形,该窗口包含客户区与非客户区。

当一个菜单条下拉出两行或更多行时,AdjustWindowRect函数不增加额外的空间。

速查:Windows NT:3.1以上版本:Windows:95以上版本:Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = =AdjustWindowRectEX函数功能:该函数依据所需客户矩形大小,计算需要的窗口矩形的大小。

pywin32 win32api 枚举控件

pywin32 win32api 枚举控件

pywin32 win32api 枚举控件(原创实用版)目录1.介绍 pywin32 和 win32api2.解释枚举控件的概念3.介绍如何使用 pywin32 和 win32api 进行枚举控件正文1.介绍 pywin32 和 win32apipywin32 是一个 Python 扩展模块,用于访问 Windows 的本地 API。

它提供了对 Windows API 的便捷访问,使得 Python 程序员可以轻松地使用 Windows 的本地功能。

而 win32api 是 Windows API 的官方文档,它包含了 Windows API 的所有函数和数据结构。

2.解释枚举控件的概念枚举控件是一种用于显示一组选项的控件。

在 Windows 操作系统中,枚举控件常用于下拉列表、单选按钮等场景。

例如,在文件选择对话框中,用户可以从一组文件类型中选择一个选项。

3.介绍如何使用 pywin32 和 win32api 进行枚举控件要使用 pywin32 和 win32api 进行枚举控件,需要以下步骤:1) 首先,需要导入 pywin32 模块。

```pythonimport win32com.client```2) 使用 pywin32 的 win32com.client 模块,创建一个枚举对象。

```pythonenumeration = win32com.client.Dispatch("ADODB.Enum")```3) 使用枚举对象的`Add`方法,向枚举中添加选项。

```pythonenumeration.Add "Option1"enumeration.Add "Option2"enumeration.Add "Option3"```4) 使用枚举对象的`Get`方法,获取当前选中的选项。

```pythonselected_option = enumeration.Get```5) 使用 pywin32 的`comtypes.client`模块,将枚举控件添加到窗口中。

项目3 Win32 API网络通信程序

项目3 Win32 API网络通信程序
将获取用户消息、发送消息的代码写在“发送” 按钮的消息中。
将接收消息、并显示消息的代码写在“接收”按 钮的消息中。
将关闭套接字的代码写到“退出”按钮或 WM_QUIT的消息处理函数中。
LB_ADDSTRING
向列表框中添加内容,需要使用的函数如下: SendDlgItemMessage(hDlg,IDC_RECVBUF,
声明套接字变量的另一种方法
如果要将套接字和地址的声明写在回调函数内 ,则可将套接字声明为静态变量。
编写WinSock对话框程序的流程
将初始化WinSock协议栈的代码写到 WM_INITDIALOG初始化事件中。
将创建套接字、以及监听、接受连接的代码写到 “创建服务器”的按钮消息中。
事件→事件处理程序
事件→消息→消息处理程序 自定义消息→消息处理程序
1.4 句柄
句柄,顾名思义,指的是一个windows对象 的把柄。
Windows中的句柄都是32位的指针变量,用 来指向某个windows对象所占据的内存区。
句柄的使用,极大地方便了Windows管理其 内存中的各种windows对象。
4. 要设置编辑框显示的内容,应使用 函数。
5. 要获取编辑框显示的内容,应使用 函数。
6. 要向列表框中添加一行文本,应使用 函数。
7. 在Windows API程序中,对话框是通过 创建的。
函数
8. 在VC6中,怎样保证向列表框Listbox中添加消息 时,消息总是从上到下按时间顺序显示?
编写Windows程序的两种方法
编写对话框程序
只保留DialogBox函数
对话框和窗体的区别
对话框和窗体
对话框与窗体的区别在于:窗体的上方有菜单 栏和工具按钮栏,下方有状态栏。例如Word 软件;而对话框没有菜单栏和工具栏等

win32api的使用方法

win32api的使用方法

win32api的使用方法
win32api的使用方法主要包括以下几种:
1. 调用win32api函数,如GetCursorPos()函数获取光标位置。

具体地,需要在代码中声明一个POINT结构体,然后使用DllImport属性导入动态链接库,最后调用GetCursorPos()函数并将返回的光标位置赋值给POINT 结构体中的X和Y属性。

2. 使用invoke语句调用API函数。

在MASM汇编语言中,可以使用invoke语句来调用API函数,并指定函数的参数。

编译器会检查参数的数量和类型是否正确,如果参数少了或者类型不匹配,会报错。

3. 在调用API函数之前,需要先声明该函数。

声明的格式包括函数名、原型、距离、语言和参数列表,其中参数列表包括每个参数的名称、数据类型和修饰符。

需要注意的是,win32api的使用需要一定的编程基础和经验,因此在学习使用win32api之前,建议先学习相关的编程语言和基础知识。

同时,win32api的使用也需要考虑到操作系统的版本和位数,不同的操作系统版本和位数可能会对API函数的可用性和行为产生影响。

因此,在使用
win32api时,需要注意选择正确的API函数并了解其用法和限制。

Win32API函数大全

Win32API函数大全

1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称WNetGetUser 获取一个网络资源用以连接的名字WNetOpenEnum 启动对网络资源进行枚举的过程2. API之消息函数BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口SendMessageTimeout 向窗口发送一条消息SendNotifyMessage 向窗口发送一条消息3. API之文件处理函数CloseHandle 关闭一个内核对象。

win32api outputdebugstring重定向原理

win32api outputdebugstring重定向原理

win32api outputdebugstring重定向原理Win32API OutputDebugString 重定向原理OutputDebugString是Win32API中用来向调试器输出调试信息的函数,通常用于在调试过程中输出调试信息以便进行调试和排查问题。

但有时我们希望将OutputDebugString输出的信息重定向到其他地方,比如日志文件或者其他程序中进行处理。

本文将介绍如何实现OutputDebugString的重定向原理。

在Win32API中,OutputDebugString函数的原型如下:```cvoid OutputDebugString(LPCTSTR lpOutputString);```其中,lpOutputString参数为要输出的调试信息字符串。

当调用OutputDebugString函数时,系统会将lpOutputString中的内容发送到调试器进行显示。

要实现OutputDebugString的重定向,我们可以通过Hook的方式来劫持OutputDebugString函数的调用,并将调试信息输出到我们指定的地方。

具体步骤如下:1. 获取OutputDebugString函数的地址首先,我们需要获取OutputDebugString函数的地址,这可以通过GetProcAddress函数来实现。

OutputDebugString函数通常位于Kernel32.dll中,我们可以通过LoadLibrary函数加载Kernel32.dll,然后使用GetProcAddress函数获取OutputDebugString函数的地址。

2. 创建自定义的OutputDebugString函数接下来,我们需要编写自定义的OutputDebugString函数,该函数将用来替代系统的OutputDebugString函数。

在自定义函数中,我们可以将调试信息输出到我们指定的地方,比如日志文件中。

C#+Win32API控制鼠标的事件:左击,右击,双击,移动,滚动,等等.(部分参考)主...

C#+Win32API控制鼠标的事件:左击,右击,双击,移动,滚动,等等.(部分参考)主...

C#+Win32API控制⿏标的事件:左击,右击,双击,移动,滚动,等等.(部分参考)主...2009-07-23 17:14如图:源码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;using System.Runtime.InteropServices;namespace test.AutoClickMouseLeftButton{public partial class AutoClickMouseLeftButton : Form{[DllImport("User32")]public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtrdwExtraInfo);[DllImport("User32")]public extern static void SetCursorPos(int x, int y);[DllImport("User32")]public extern static bool GetCursorPos(out POINT p);[StructLayout(LayoutKind.Sequential)]public struct POINT{public int X;public int Y;}public enum MouseEventFlags{Move = 0x0001,LeftDown = 0x0002,LeftUp = 0x0004,RightDown = 0x0008,RightUp = 0x0010,MiddleDown = 0x0020,MiddleUp = 0x0040,Wheel = 0x0800,Absolute = 0x8000}private void AutoClick(int x, int y){POINT p = new POINT();GetCursorPos(out p);try{SetCursorPos(x, y);mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);}finally{SetCursorPos(p.X, p.Y);}}bool isBoot = false;protected override bool ProcessCmdKey(ref Message msg, Keys keyData){const int WM_SYSTEMDOWN = 0x104;//系统功能按键const int WM_KEYDOWN = 0x100;//普通按键if ((msg.Msg == WM_SYSTEMDOWN)||(msg.Msg==WM_KEYDOWN)){switch (keyData){//因为我的笔记本的Home与⽅向键集成⼀起块.//不知道怎么按出HOME键了,所以⽤普按键:⽅向键上:UP来代替了.//你运⾏的时候你可以⾃⼰修改.//把case Keys.Up隐掉,把case Keys.Home还原就是了。

史上最强---win32API函数大全文档

史上最强---win32API函数大全文档

史上最强---win32API函数大全文档Win32 API函数大全1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称WNetGetUser 获取一个网络资源用以连接的名字WNetOpenEnum 启动对网络资源进行枚举的过程2. API之消息函数BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口SendMessageTimeout 向窗口发送一条消息SendNotifyMessage 向窗口发送一条消息3. API之文件处理函数CloseHandle 关闭一个内核对象。

win32 API 简明教程

win32 API 简明教程
程序可执行模块的句柄(內存中的.exe 文件). HINSTANCE hPrevInstance
在 Win32 程序中总是为 NULL. LPSTR lpCmdLine
命令行参数组成的一个单字符串.不包括程序名字. int nCmdShow
一个将要传递给 ShowWindow()的整数,我们在后面进行讨论.
调用规则
WINAPI 指定调用规则并被定义为_stdcall.要是你不知道它是干什么用的,先不管它, 在我们的这个教程中它对我们沒有影响.记住在这个位置我们需要它就是了.
Win32 数据类型
你会发现很多普通的关键字或类型在 windows 中有特定的定义.UINT 是 unsigned int,LPSTR 是 char*等等...你怎么用完全取決于你自己.你要是喜欢 char*超过了 LPSTR,那就用就是了.当然在你替換一个数据类型前你要确定你知道它是什么.
本教程不会教你 C 语言,也不会教你怎么使用你喜欢的编译器(Borland C++,Visual C ++,LCC-Win32,等等).但是我将在附表中就我对编译器的所知提供一些说明.
如果你不知道 macro 或 typedef 是什么,或 switch()语句如何工作,那你要先回去找 一本好的 C 语言的教程学习一下.
重要说明
在此文档的某些部分我将指出某些地方很重要.因为很多人在不閱读它们情況下造成理 解困难,你如果不閱读,你很可能也陷入困难. 第一个就是:
以 zip 打包的源代码范例不是可选可不选的!我沒有把所有的代码放在教程中,只放了 那些与我正在讨论问题相关的.要想知道这里的代码怎么与其它部分配合,就必须去看 zip 文件中的源代码.
欢迎阅读 theForger's Win32 API 教程第二版(简体中文)

Win32 API 函数大全使用详解

Win32 API 函数大全使用详解

一、窗口函数(Window)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == =AdjustWindowRect函数功能:该函数依据所需客户矩形的大小,计算需要的窗日矩形的大小。

计算出的窗口矩形随后可以传递给CreateWindow函数,用于创建一个客户区所需大小的窗口。

函数原型:BOOL AdjustWindowRect(LPRECT lpRect ,DWORD dwStyle,BOOL bMENU);参数:lpRect:指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。

函数返回时,该结构容纳所需客户区域的窗口的左上角和右下角的坐标。

dwStyle:指定将被计算尺寸的窗口的窗口风格。

bMenu:指示窗口是否有菜单。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

获取错误信息,参看GetLastError。

备注:客户矩形是指完全包含一个客户区域的最小矩形;窗日矩形是指完全包含一个窗口的最小矩形,该窗口包含客户区与非客户区。

当一个菜单条下拉出两行或更多行时,AdjustWindowRect函数不增加额外的空间。

速查:Windows NT:3.1以上版本:Windows:95以上版本:Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = =AdjustWindowRectEX函数功能:该函数依据所需客户矩形大小,计算需要的窗口矩形的大小。

win32调试api学习心得

win32调试api学习心得

《加密解密技术内幕》3.24 Win32调试API学习心得(一)最近学习了一下WIN32的调试API,并做了一个简单的调试器,略有心得,特写出来希望对需要的朋友有所帮助.参考资料:lczlion:<<win32汇编程序设计>>彭春华:<<用Debug函数实现API函数的跟踪>>概述:Windows提供了一组供程序员使用的API,使用这些API,我们能够建立或捆绑到已运行的程序上来对他们进行调试,能获得程序的底层信息和调试信息.如果你原意的话,甚至可以对被调试程序进行任意的修改(用WriteProcessMemory).先让我们从一个有趣的小例子开始吧: 打开DELPHI,新建工程,然后双击主窗体,在主窗体的Create事件中写下如下代码.procedure TForm1.FormCreate(Sender: TObject);varisDebuggerPresent: function:Boolean;DllModule: THandle;beginDllModule := LoadLibrar y(’kernel32.dll’);isDebuggerPresent := GetProcAddress(DllModule, ’IsDebuggerPresent’);if isDebuggerPresent thenbeginMessageBox(self.Handle, ’请不要调试我!’, ’抗议’, MB_OK or MB_ICONASTERISK);Application.Terminate;end;end;按F9运行,程序执行得并不顺利,在弹出来一个抱怨你调试了它的窗口后就中止了.然后我们再在DELPHI的Projecs目录下找到刚刚编释出来的程序, 双击执行它,这次窗口就老老实实的出来了,这是怎么回事呢?原来上面的isDebuggerPresent就是Win32调试API中的一员,它的作用是判断调用它的进程是否在调试描述表下运行(也就是是否处于被调试状态),另一方面也说明了DELPHI的调试器也是用Win32调试API实现的.这下对调试API有兴趣了吧?那让我们来继续深入调试API的世界!得到一个供调试的程序:由于我们的程序要扮演调试器的角色,我们还必需要有一个供调试的程序.这个程序可以通过二种方法获得:1:使用DebugActiveProcess函数.这个函数的定义是DebugActiveProcess(dwProcessID: DWORD):Bool; stdcall, dwProcessID用于指定被调试的进程的标识符,如果函数调用成功返回TRUE,失败返回FALSE.注意,如果是在NT/2000/XP上,如果目标进程是由一个安全描述器创建的,而该安全描述符使调试器没有充分的访问权,那么此函数的调用可能失败.2:使用CreateProcess函数.这个函数的定义是CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; constlpStartupInfo: TStartupInfo; varlpProcessInformation: TProcessInformation): BOOL; stdcall由于篇幅原因,这儿就不详解CreateProcess的每个参数的含义,具体请参考API大全,我们这儿只谈如何创建一个被调试的进程.即设置dwCreationFlags参数,你可以指定DEBUG_PROCESS标志来建立一个被调试进程,同时被调试进程的子进程的调试信息也将通知我们的调试器.还可以指定DEBUG_PROCESS or DEBUG_ONL Y_THIS_PROCESS标志来表示只调试当前过程.处理调试信息:当我们用上面的方法之一打开了被调试的程序后,我们的程序应调用WaitForDebugEvent 等待处理调试事件.它阻塞调用线程直到调试的事件发生.此函数的定义是: WaitForDebugEvent(varlpDebugEvent: TDebugEvent; dwMilliseconds: DWORD): BOOL; stdcall;其中lpDebugEvent结构将在调试事件发生时返回发生的调试事件信息.dwMilliseconds值指定函数等待调试事件的时间,以毫秒为单位,一般设为INFINITE,表示一直等待直到调试事件发生.这有点于类似于一个消息循环.我们一般都会新建一个线程,在线程中使用DebugActiveProcess或CreateProcess得到一个供调试的程序,然后用一个循环调用WaitForDebugEvent来处理随后发生的调试事件.至于为什么要在新的线程中处理呢?你不会想你的调试器一打开被调试程序后就一动也不能动了吧;-)继续运行被调试程序:当调试事件发生后,被调试程序会被WINDOWS挂起,当我们处理完了调试事件后,还要让被调试程序继续运行,这就要用到ContinueDebugEvent函数,定义如下:ContinueDebugEvent(dwProcessId, dwThreadId, dwContinueStatus: DWORD): BOOL; stdcall;其中dwProcessID和dwThreadID是要被恢复的进程和线程ID,可以从lpDebugEvent结构中的dwProcessID和dwThreadID取得.dwContinueStatus是指明如何恢复线程,可能的取值有DBG_CONTINUE 和DBG_EXCEPTION_NOT_HANDLED,DBG_CONTINUE指明了如果被调试程序发生了异常,由调试器来处理异常.DBG_EXCEPTION_NOT_HANDLED则表示调试器不处理被调试程序的异常,由被调试程序的默认异常处理程序来处理异常.下面是一个简单的例子,实现了监视被调试程序的建立和退出.unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}{调试信息处理过程}procedure DebugPro;varsi: _STARTUPINFOA; {进程启动信息}pi: _PROCESS_INFORMATION; {进程信息}Flage: DWORD;DebugD: DEBUG_EVENT; {调试事件}Rc: Boolean;begin{建立调试进程}Flage := DEBUG_PROCESS or DEBUG_ONL Y_THIS_PROCESS;GetStartupInfo(si); {初始化si结构,不然无法正常建立进程}if not CreateProcess(nil, Pchar(’C:\winnt\NOTEPAD.EXE C:\Boot.ini’), nil, nil,False, Flage, nil, nil, si, pi) thenbeginMessageBox(Application.Handle, ’建立被调试进程失败’, ’!!!’, MB_OK or MB_ICONERROR);exit;end;while WaitForDebugEvent(DebugD, INFINITE) dobegin {根据事件代码进行相应处理}case DebugD.dwDebugEventCode ofEXIT_PROCESS_DEBUG_EVENT:beginMessageBox(Application.Handle, ’被调试进程中止’, ’!!!’, MB_OK or MB_ICONERROR);Break;end;CREATE_PROCESS_DEBUG_EVENT:MessageBox(Application.Handle, ’被调试进程建立’, ’!!!’, MB_O K or MB_ICONERROR);EXCEPTION_DEBUG_EVENT:beginif (DebugD.Exception.ExceptionRecord.ExceptionCode<> EXCEPTION_SINGLE_STEP) and(DebugD.Exception.ExceptionRecord.ExceptionCode<> EXCEPTION_BREAKPOINT) thenRc := False {如果被调试程序产生了异常,让它自己处理}elseRc := True;end;end;if Rc thenContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,DBG_CONTINUE)elseContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);end;CloseHandle(pi.hProcess);Closehandle(pi.hThread);end;procedure TForm1.Button1Click(Sender: TObject);varThreadHandle, ThreadID: THandle;beginThreadHandle := CreateThread(nil, 0, @DebugPro, nil, 0, ThreadID);end;end.《加密解密技术内幕》3.25 Win32调试API学习心得(二)上一章讲解了如何用调试API来打开一个被调试程序,并给出了一个简单的例子,这一章将祥细讲解调试消息包含的内容.类似于消息处理中的消息结构TMessage一样,调试事件也有自己特定的事件结构,那就是TDebugEvent, TDebugEvent在Delphi中的定义为:TDebugEvent = _DEBUG_EVENT;_DEBUG_EVENT = recorddwDebugEventCode: DWORD;dwProcessId: DWORD;dwThreadId: DWORD;case Integer of0: (Exception: TExceptionDebugInfo);1: (CreateThread: TCreateThreadDebugInfo);2: (CreateProcessInfo: TCreateProcessDebugInfo);3: (ExitThread: TExitThreadDebugInfo);4: (ExitProcess: TExitThreadDebugInfo);5: (LoadDll: TLoadDLLDebugInfo);6: (UnloadDll: TUnloadDLLDebugInfo);7: (DebugString: TOutputDebugStringInfo);8: (RipInfo: TRIPInfo);end;这个结构很复杂,包含了三个基本类型和一个联合类型的数据.dwProcessId和dwThreadId 指明了产生调试事件的进程和线程的ID,dwDebugEventCode指明了产生了何种调试事件,可能的取值如下表(摘自<<Win32汇编程序设计>>):1.CREATE_PROCESS_DEBUG_EVENT:进程被创建.当被调试进程刚被创建(还未运行) 或我们的程序刚以DebugActiveProcess捆绑到一个运行中的进程时该事件发生. 这是我们的程序应该获得的第一个事件.2.EXIT_PROCESS_DEBUG_EVENT:被调试进程退出时产生此消息.3.CREATE_THEAD_DEBUG_EVENT:当一个新线程在被调试进程中创建或我们的程序首次捆绑到运行中的进程时该事件发生.要注意的是当被调试进程的主线程被创建时不会收到该通知. 4.EXIT_THREAD_DEBUG_EVENT:被调试进程中的线程退出时事件发生.被调试进程的主线程退出时不会收到该通知.我们可以认为被调试进程的主线程与被调试进程是同义词. 因此, 当我们的程序看到CREATE_PROCESS_DEBUG_EVENT标志时,对主线程来说,就是CREATE_THREAD_DEBUG_EVENT标志.5.LOAD_DLL_DEBUG_EVENT:被调试进程装入一个DLL.当PE装载器第一次分解指向DLL的链接时,我们将收到这一事件. (当调用CreateProcess装入被调试进程时)并且当被调试进程调用Lo adLibrary时也会发生.6.UNLOAD_DLL_DEBUG_EVENT:一个DLL从被调试进程中卸载时此事件发生.7.EXCEPTION_DEBUG_EVENT:在被调试进程中发生异常时事件发生.异常实际上是一个调试中断(int 3h).如果想恢复被调试进程事,以DBG_CONTINUE 标志调用ContinueDebugEvent函数.不要使用DBG_EXCEPTION_NOT_HANDLED 标志否则被调试进程会在NT下拒绝运行(Win98下运行得很好).8.OUTPUT_DEBUG_STRING_EVENT:当被调试进程调用DebugOutputString函数向我们的程序发送消息字符串时该事件发生.9.RIP_EVENT:系统调试发生错误.根据dwDebugEventCode的不同,应调用联合中相应的结构来获得相关的调试信息.例如我们有个名为Debug的TDebguEvent的结构,在调用WaitForDebugEvent(Debug, INFINITE)后接收到调试信息时,并且dwDebugEventCode的值为CREATE_PROCESS_DEBUG_EVENT,我们就可以通过仿问Debug.CreateProcessInfo.hProcess来获得刚创建的被调试进程的进程句柄.下面将祥细讲解TDebugEvent结构中可能包括的每个结构的含义.因为没有相关的祥细资料,大部分结果是靠测试所得,如有错漏敬请指正.一.CreateProcessInfo结构: 对应的调试消息CREATE_PROCESS_DEBUG_EVENT. CreateProcessInfo.hFile:被调试进程的EXE文件被映射到内存中的内存文件映射句柄,可以通过打开这个句柄(用OpenFileMapping和MapViewOfFile)来读取此EXE文件的相关信息.如引入引出表等.CreateProcessInfo.hProcess:被调试进程的进程句柄,如果要使用ReadProcessMemory和Wri teProcessMemory等函数来修改被调试进程,就需要用到这个句柄,可以用一个变量保存起来供以后使用.CreateProcessInfo.hThread:主线程句柄.CreateProcessInfo.lpBaseOfImage:可执行文件被装载到虚似地址空间中的基址. CreateProcessInfo.dwDebugInfoFileOffset:调试信息在可执行文件中的偏移地址(一般为0,即没有调试信息).CreateProcessInfo.nDebugInfoSize:调试信息的长度.CreateProcessInfo.lpThreadLocalBase:主线程基址.CreateProcessInfo.lpStartAddress:主线程的线程函数地址.CreateProcessInfo.lpImageName:文件映像名,注意这是一个RV A地址(相对虚拟地址). CreateProcessInfo.fUnicode:如果此值大于0,则lpImageName指向的文件名为UNICODE码.二.ExitProcess结构: 对应的调试消息EXIT_PROCESS_DEBUG_EVENT. ExitProcess.dwExitCode:即被调试程序调用ExitProcess函数时传入的退出代码.三.CreateThread结构: 对应的调试消息CREATE_THEAD_DEBUG_EVENT. CreateThread.hThread:新建线程的句柄.线程句柄,如果以后会涉及到对线程的操作,如挂起线程等,则可以用一个TList来保存进程ID(TDebugEvent.dwThreadId)和相对应的句柄.再在其它调试事件发生时,根据dwThreadId得到线程句柄.CreateThread.lpThreadLocalBase:新线程的基址.CreateThread.lpStartAddress:新线程的线程函数地址.四.ExitThread结构: 对应的调试消息EXIT_THREAD_DEBUG_EVENT.ExitThread.dwExitCode:即退出的线程调用ExitThread函数时传入的退出代码.五.LoadDll结构: 对应的调试消息LOAD_DLL_DEBUG_EVENT.LoadDll.hFile:被加载的DLL文件映射到内存中的内存文件映射句柄,可以通过打开这个句柄来读取此DLL文件的相关信息.LoadDll.lpBaseOfDll:DLL文件被装载到虚似地址空间中的基址.这个地址加上DLL文件引出的函数的地址,就是这个函数在内存中的地址.LoadDll.dwDebugInfoFileOffset:调试信息在DLL文件中的偏移地址.LoadDll.nDebugInfoSize:调试信息的长度.LoadDll.lpImageName:DLL文件名的地址,是一个RV A地.LoadDll.fUnicode:如果此值大于0,则lpImageName指向的文件名为UNICODE码.六.UnLoadDll结构: 对应的调试消息UNLOAD_DLL_DEBUG_EVENT.UnloadDll.lpBaseOfDll:卸载的DLL文件的基址,可以通过在处理LOAD_DLL_DEBUG_EVENT消息中保存DLL信息和对应的基址的方法,来得到卸载的DLL信息.七.Exception结构: 对应的调试消息EXCEPTION_DEBUG_EVENT.Exception.ExceptionRecord: 这是一个TExceptionRecord结构,里面包含了被调试程序产生的中断或异常的代码,产生的中断或异常的地址等信息.八.DebugString结构: 对应的调试消息OUTPUT_DEBUG_STRING_EVENT. DebugString.lpDebugStringData:被调试进程调用DebugOutputString函数发送的消息字符串的地址.DebugString.nDebugStringLength:被调试进程调用DebugOutputString函数发送的消息字符串的长度.DebugString.fUnicode:如果此值大于0,则消息字符串为UNICODE码.九.RipInfo结构: 对应的调试消息RIP_EVENT.RipInfo.dwError:错误代码.RipInfo.dwType:错误类型.了解了以上的知识,我们就可以在调试器中监视这些调试消息,并获得我们感兴趣的信息.但这仅仅实现了对被调试调试程序的监视.下一章将讲解如何修改被调试程序.《加密解密技术内幕》3.26 win32调试API学习心得(三)要学习如何修改被调试进程,先让我们来了解几个与此有关的函数.一.读指定进程内存:ReadProcessMemory此函数的定义为:function ReadProcessMemory(hProcess: THandle; constlpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; varlpNumberOfBytesRead: DWORD): BOOL; stdcall;hProcess指向被读取内存的进程的句柄,此句柄必须有PROCESS_VM_READ权限. lpBaseAddress:指向被读取的内存在进程中基地址的指针.lpBuffer:指向用于保存读出数据的缓冲区的指针.nSize:指定从指定进程中要读取的字节数.lpNumberOfBytesRead:指向读出数据的实际字节数.二.写指定进程内存:WriteProcessMemory此函数的定义为:function WriteProcessMemory(hProcess: THandle; constlpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; varlpNumberOfBytesWritten: DWORD): BOOL; stdcall;参数含义同ReadProcessMemory,其中hProcess句柄要有对进程的PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限.lpBuffer为要写到指定进程的数据的指针.注意,如果要修改的内存所在的页面的存取保护属性为只读,如代码段,要修改页面的存取保护才能够正常修改.可使用VirtualProtectEx函数,请参考下面的代码片段: VirtualProtectEx(hPHandle, Address, SizeOf(BYTE), PAGE_READWRITE, OldFlg); WriteProcessMemory(hPHandle, Address, @BreakCode, SizeOf(BYTE), Read); VirtualProtectEx(hPhandle, Address, SizeOf(BYTE), OldFlg, OldFlg); // 恢复页码保护属性hPHandle为目标进程句柄,Address为要修改的内存的基址,SizeOf(BYTE)表示要修改的区域长度,如果这个长度跨过一个或几个页面边界时,将修改跨过的所有页面的存取保护属性,OldFlg用来存放原来的存取保护属性,以便调用WriteProcessMemory后恢复页面保护属性.三.得到指定线程的上下文结构:GetThreadContext此函数的定义为:function GetThreadContext(hThread: THandle; varlpContext: TContext): BOOL; stdcall;hThread:要取得上下文结构的线程的句柄,可以在发生CREATE_THEAD_DEBUG_EVENT 调试事件时保存线程ID和线程句柄的关联以便调用GetThreadContext时得到线程句柄. lpContext:用来保存指定线程上下文件信息的结构.在象Windows这样的多任务操作系统中,同一时间里可能运行着几个程序.Windows分配给每个线程一个时间片,当时间片结束后,Windows将冻结当前线程并切换到下一具有最高优先级的线程.在切换之前,Windows将保存当前进程的寄存器的内容,这样当在该线程再次恢复运行时,Windows可以恢复最近一次线程运行的环境.保存的寄存器内容总称为进程上下文.上下文件的结构取决于CPU的类型.在调用GetThreadContext之前,要先设置TContext的ContextFlags标志来指明要检索的寄存器.例如只想得到CPU的段寄存器的值,可以设置ContextFlags标志为CONTEXT_SEGMENTS.其它可能的标志如下:CONTEXT_CONTROL:包含CPU的控制寄存器,比如指今指针,堆栈指针,标志和函数返回地址.CONTEXT_INTEGER:用于标识CPU的整数寄存器.CONTEXT_FLOATING_POINT:用于标识CPU的浮点寄存器.CONTEXT_SEGMENTS:用于标识CPU的段寄存器.CONTEXT_DEBUG_REGISTER:用于标识CPU的调试寄存器.CONTEXT_EXTENDED_REGISTERS:用于标识CPU的扩展寄存器.CONTEXT_FULL:相当于CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_SEGMENTS,即这三个标志的组合.四.设置指定线程的上下文结构:SetThreadContext此函数的定义为:function SetThreadContext(hThread: THandle; constlpContext: TContext): BOOL; stdcall;参数同GetThreadContext.有了这二个函数可以实现很多功能,比如用WriteProcessMemory在被调试进程的某个函数入口处写一个调试中断(int 3,即$cc),然后在运行到此调试中断时会产生中断,再用GetThreadContext得到当前线程的上下文,就可以根据Esp的值得到函数的参数等信息.你甚至可以修改Eip的值来让被调试程序跳到任何地址来执行,或是修改标志寄存器的值来修改进程的执行方式.了解了以上函数后我们就可以用来修改被调试进程了,具体能实现怎样的功能只局限于自己的想像力了,但运用不得当被调试程序通常会当得很惨。

win32事件

win32事件

怎样使用WIN32的事件(Event)核心对象----How to use WIN32 Event Kernel Object(源码下载)1、说明事件的同步是一个很麻烦的区域,虽然有很多方法去处理它。

市面上也有很多书和文章介绍怎样避免多线程产生的噩梦。

通过处理这些噩梦,我渐渐理解了WIN32的事件(Win32 Kernel objects)。

在最初时,我不能理解怎么通过在线程中使用全局变量来使用全局的核心事件;后来我理解后,我发现这个是很容易来使用的。

这里,我将解释Win32事件中关于自动和手动设置重置事件的内容。

2、关于Win32 EventsWin32 Events也像其他的核心对象一样在跨进程是可利用的。

一个Win32事件就是一个状态机,它的生命期间基于2种状态--Signaled state(激活状态,有信号状态)and Non Signaled state(为激活状态,无信号状态)。

一个事件处于激活状态,意味着这个事件可以停止正在等待这个激活信号的线程;而一个处于非激活状态的,意味着它不能停止这个正在等待这个事件信号的线程。

3、自动重置Win32事件自动重置事件----它保证关闭单线程(这个单线程正处于等待这个事件的发生,然后返回到非激活状态);如果有多个线程正在同时等待这个事件信号,这些线程是随机触发关闭的。

一些Win32事件创建和使用的API:CreateEvent(); //创建事件的APICreateThread(); //创建线程的API//等待一个事件(信号)的APIWaitForSingleObject();WaitForMultipleObject();OpenHandle(); //获得一个事件句柄的APISetEvent(); //使一个事件处于激活状态的APIResetEvent(); //使一个事件处于非激活状态的APICloseHandle(); //关闭事件句柄的API下面是自动重置事件的相关代码(VS2010):#include <Windows.h>#include <iostream>using namespace std;// 需要激活的线程DWORD WINAPI ThreadFun(LPVOID n){cout << "Thread Instantiated" << endl;// 获得激活事件的句柄(以"MyEvent"为标识)HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, false, (LPCWSTR)"MyEven t"); // (LPCWSTR)在vs2010,不加入的话会报错if(!hEvent){ return-1; }// 循环2次for(int count = 0; count < 2; ++count){ // 等待,直到hEvent事件被激活WaitForSingleObject(hEvent, INFINITE);cout << "Got The Signal.." << endl;}// 关闭事件的句柄CloseHandle(hEvent);cout << "End The Thread" << endl;return0;}int main(){// 创建一个自动重置事件("MyEvent"为它的标识):当它被激活后将自动重置为未激活状HANDLE hEvent = CreateEvent(NULL, false, false, (LPCWSTR)"MyEvent");if(!hEvent){ return-1; }// 创建一个线程,这个线程执行ThreadFun()函数DWORD Id;HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thre adFun, 0, 0, &Id); // LPTHREAD_START_ROUTINE:指向一个函数,该函数通知宿主某个线程已开始执行。

pywin32 win32api 枚举控件

pywin32 win32api 枚举控件

pywin32 win32api 枚举控件摘要:1.简介2.pywin32和win32api库3.枚举控件的方法4.示例代码5.总结正文:1.简介在Windows操作系统中,界面是由许多控件组成的。

这些控件可以是按钮、文本框、标签等。

在编写自动化脚本时,有时我们需要获取并操作这些控件。

本文将介绍如何使用pywin32和win32api库来枚举控件。

2.pywin32和win32api库pywin32是一个Python扩展模块,用于访问Windows的本地API。

它提供了丰富的函数,使我们能够方便地操作Windows系统。

而win32api是Python标准库中的一个模块,它也提供了许多与Windows API相关的函数。

我们可以使用这两个库来枚举控件。

3.枚举控件的方法要枚举控件,我们可以使用pywin32库中的EnumWindows函数。

这个函数会返回一个窗口句柄列表,我们可以遍历这个列表,进一步获取窗口相关的信息,如标题、类名等。

然后,我们可以使用win32api库中的GetWindow函数来获取控件的详细信息,如文本、坐标等。

以下是一个简单的枚举控件的示例代码:```pythonimport win32apiimport win32guidef enum_controls(hwnd, control_type):if control_type == 0: # 文本框control_class = "Edit"elif control_type == 1: # 按钮control_class = "Button"# ...添加其他控件类型else:returnctrl = win32gui.GetDlgItem(hwnd, control_class)if ctrl:print(f"控件名称:{win32gui.GetWindowT ext(ctrl)}")print(f"控件坐标:(x={win32gui.GetWindowRect(ctrl)[0]}, y={win32gui.GetWindowRect(ctrl)[1]})")print("")# 枚举子窗口for child_hwnd in win32gui.GetWindowChildren(hwnd):enum_controls(child_hwnd, control_type)# 获取当前活动窗口hwnd = win32gui.GetForegroundWindow()# 枚举所有子窗口enum_controls(hwnd, 0) # 枚举文本框```4.示例代码以上代码首先定义了一个名为enum_controls的函数,该函数接受一个窗口句柄和一个控件类型作为参数。

python win32api 操作句柄

python win32api 操作句柄

python win32api 操作句柄Win32 API是一种用于在Windows操作系统上进行编程的应用程序接口。

它提供了一组函数和常量,开发人员可以使用这些函数和常量来访问操作系统的功能。

其中,win32api模块是Python中用于操作句柄的一个重要模块。

句柄是一种数据结构,用于标识操作系统中的各种资源,例如窗口、文件、进程等。

通过win32api模块,开发人员可以获取、创建、操作和关闭句柄,实现对各种资源的控制和管理。

下面将列举10个使用win32api操作句柄的例子。

1. 获取窗口句柄:可以使用win32api的FindWindow函数获取指定窗口标题的句柄。

例如,可以通过以下代码获取记事本窗口的句柄:```pythonimport win32guihwnd = win32gui.FindWindow(None, "记事本")```2. 关闭窗口:可以使用win32api的PostMessage函数向指定窗口发送关闭消息,实现关闭窗口的功能。

例如,可以通过以下代码关闭记事本窗口:```pythonimport win32api, win32conwin32api.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)```3. 获取进程句柄:可以使用win32api的OpenProcess函数获取指定进程的句柄。

例如,可以通过以下代码获取记事本进程的句柄:```pythonimport win32api, win32con, win32processpid = win32process.GetWindowThreadProcessId(hwnd)[1] hProcess = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid)```4. 读取进程内存:可以使用win32api的ReadProcessMemory函数读取指定进程的内存数据。

Win32系统API讲义

Win32系统API讲义
hchild=StartClone(); //创建一个子进程
WaitForSingleObject (hchild, INFINITE); }
void Child() { printf(“Child is quiting.\n”); Sleep(5000); //暂停5秒
}
26
void StartClone() { //创建当前进程的克隆进程 GetModuleFileName(NULL, szFilename, MAX_PATH); //获得当前可执行文件名 STARTUPINFO si; si.cb=sizeof(si);//存子进程启 动信息,P234有说明,新进程主窗口外观 sprintf(szCmdLine, “\”%s\”Child”, szFilename); bCreateOK=CreateProcess(szFilename, szCmdLine,...,CREATE_NEW_CONSOLE,...,&si, &pi); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return pi.hProcess;
20
2. 获得当前进程标识符的函数 DWORD GetCurrentProcessId(void); 3. 以指定时间间隔挂起当前执行线程 VOID Sleep(DWORD dwMilliseconds); 以毫秒为单位
21
4. 检索含有给定模块的可执行文件路径名 DWORD GetModuleFileName(
NULL,
//or“c:\\windows\\system32\\notepad.exe”
szCmdLine, // szCmdLine=“notepad”

python win32api message用法

python win32api message用法

`win32api` 模块是Python 中用于调用Windows API 函数的扩展模块,它提供了许多函数,其中包括用于发送消息(message)的功能。

在Windows 操作系统中,消息是窗口之间进行通信的基本方式,通过消息,窗口可以接收和处理用户输入、系统事件等。

以下是关于在Python 中使用`win32api` 模块发送消息的基本用法和一些常见的消息类型:### 安装`pywin32`首先,确保你已经安装了`pywin32` 模块。

如果没有安装,可以通过以下命令安装:```bashpip install pywin32```### 使用`win32api` 发送消息`win32api` 模块中的`SendMessage` 函数用于向窗口发送消息。

以下是基本的用法:```pythonimport win32api# 获取窗口句柄hwnd = win32api.FindWindow(None, "窗口标题")# 定义消息和参数message = 0x100 # WM_KEYDOWN,此处可以根据需要修改为其他消息类型w_param = 0x41 # 与消息类型相关的参数,此处以按下键盘上的'A' 键为例# 发送消息win32api.SendMessage(hwnd, message, w_param, 0)```在上述代码中:- `FindWindow` 用于根据窗口标题查找窗口句柄,如果你知道窗口类名,也可以将第一个参数设为类名。

- `SendMessage` 是发送消息的函数,第一个参数是窗口句柄,第二个参数是消息类型,第三个和第四个参数是消息相关的参数,具体参数含义取决于消息类型。

### 示例:模拟按键操作以下是一个示例,演示如何使用`win32api` 模拟按键操作:```pythonimport win32apiimport timedef send_key_event(hwnd, key_code):# 发送按键按下事件win32api.SendMessage(hwnd, win32api.WM_KEYDOWN, key_code, 0)# 等待一段时间,模拟按键按下的效果time.sleep(0.1)# 发送按键释放事件win32api.SendMessage(hwnd, win32api.WM_KEYUP, key_code, 0)# 获取窗口句柄hwnd = win32api.FindWindow(None, "窗口标题")# 模拟按下和释放'A' 键send_key_event(hwnd, ord('A'))```在这个示例中,我们使用`ord('A')` 获取'A' 键的ASCII 码,然后通过`send_key_event` 函数发送按键按下和释放事件。

python win32api message用法

python win32api message用法

python win32api message用法Python是一种高级编程语言,被广泛应用于各种领域和技术。

在Python中,win32api模块提供了与Windows系统交互的功能,包括发送和接收系统消息。

本文将详细介绍Python中win32api message的用法及示例。

一、win32api模块简介win32api是Python的一个扩展模块,提供了访问Windows系统API函数的接口,可以实现与Windows系统的各种交互操作。

通过win32api模块,我们可以发送系统消息、读取窗口句柄、操作文件和注册表等等。

二、win32api message的基本概念在Windows系统中,消息是应用程序之间进行通信的一种方式。

当用户与操作系统或者应用程序进行交互时,会发出一些消息,如鼠标点击、键盘输入等。

win32api message用于发送和接收这些消息。

三、win32api message的使用方法1. 导入win32api模块在使用win32api message之前,我们首先需要导入win32api模块。

可以使用以下代码进行导入:```pythonimport win32api```2. 发送消息要发送消息,我们需要确定目标窗口的句柄(handle),然后使用win32api的SendMessage函数来发送消息。

SendMessage函数的基本语法如下:```pythonwin32api.SendMessage(handle, message, wParam, lParam)```其中,handle是目标窗口的句柄,message是要发送的消息,wParam和lParam是消息的参数。

3. 接收消息接收消息需要使用win32api的GetMessage函数来获取系统发送的消息。

GetMessage函数的基本语法如下:```pythonwin32api.GetMessage()```该函数会返回一个元组,包含收到的消息的类型、wParam和lParam。

Win32 Api编程指南

Win32 Api编程指南
#include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
MessageBox( NULL, "Goodbye, cruel world!", "Note", _OK ); return 0; }
实际上是发送给窗口的窗口过程函数处理这个窗口也许是我们的主窗口也许是别的窗口或者仅仅是一个操作很多情况下窗口的创建是不显示在屏幕上的可能由系统隐式的创建或者由另一个程序创建而这些都不需要我们操心因为我们通信的途径就是通过发送和接受消息其余的事情操作系统会为我们打理
Win32 API 编程指南( 1 )
其实只要记住几个要点也就很容易理解了。LP 前缀代表指向长整形的指针( long pointer )。在 Win32 中,long 是一种古老的类型了,这里不用细说。如果您不知道指针是什么,您有两种选择:1 )去找本 C 的书
读一读。 2 )继续读下去,可能会弄得一团糟。我强烈建议您选择第一种,但还是有很多人坚持选择第二种( 我 已经给了您建议哦: ) 别怪我没提醒您! )
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL ); if ( hwnd == NULL ) { MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
最简单的 Win32 程序

pythonwin32apiwin32guiwin32con窗口句柄发送消息常用方法键盘输入

pythonwin32apiwin32guiwin32con窗口句柄发送消息常用方法键盘输入

pythonwin32apiwin32guiwin32con窗⼝句柄发送消息常⽤⽅法键盘输⼊import win32guiimport win32conimport win32api# 从顶层窗⼝向下搜索主窗⼝,⽆法搜索⼦窗⼝# FindWindow(lpClassName=None, lpWindowName=None) 窗⼝类名窗⼝标题名handle = win32gui.FindWindow("Notepad", None)# 获取窗⼝位置left, top, right, bottom = win32gui.GetWindowRect(handle)#获取某个句柄的类名和标题title = win32gui.GetWindowText(handle)clsname = win32gui.GetClassName(handle)# 打印句柄# ⼗进制print(handle)# ⼗六进制print("%x" %(handle) )# 搜索⼦窗⼝# 枚举⼦窗⼝hwndChildList = []win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd), hwndChildList)# FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) ⽗窗⼝句柄若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索⼦窗体,否则从第⼀个⼦窗体开始搜索。

⼦窗⼝类名⼦窗⼝标题subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)# 获得窗⼝的菜单句柄menuHandle = win32gui.GetMenu(subHandle)# 获得⼦菜单或下拉菜单句柄# 参数:菜单句柄⼦菜单索引号subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)# 获得菜单项中的的标志符,注意,分隔符是被编⼊索引的# 参数:⼦菜单句柄项⽬索引号menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)# 发送消息,加⼊消息队列,⽆返回# 参数:句柄消息类型 WParam IParamwin32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0)# wParam的定义是32位整型,high word就是他的31⾄16位,low word是它的15⾄0位。

Winapi32函数说明

Winapi32函数说明

Winapi32函数说明Contents[Trial version] ⽂本和字体函数[Trial version] EnumFonts[Trial version] ExtTextOut[Trial version] GetAspectRatioFilterEx[Trial version] GetCharABCWidths[Trial version] GetCharABCWidthsFloat[Trial version] GetCharacterPlacement[Trial version] GetCharWidth[Trial version] GetFontData[Trial version] GetFontLanguageInfo[Trial version] GetGlyphOutline[Trial version] GetKerningPairs[Trial version] GetOutlineTextMetrics[Trial version] GetRasterizerCaps[Trial version] GetTabbedTextExtent[Trial version] GetTextAlign[Trial version] GetTextCharacterExtra[Trial version] GetTextCharset[Trial version] GetTextCharsetInfo[Trial version] GetTextColor[Trial version] GetTextExtentExPoint[Trial version] GetTextExtentPoint[Trial version] GetTextFace[Trial version] GetTextMetrics[Trial version] GrayString[Trial version] PolyTextOut[Trial version] RemoveFontResource[Trial version] SetMapperFlags[Trial version] SetTextAlign[Trial version] SetTextCharacterExtra[Trial version] SetTextColor[Trial version] SetTextJustification[Trial version] TabbedTextOut[Trial version] TextOut[Amber demo]⽂本和字体函数,共三页。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Win32 API 三两事(一)平日编程都是调用封装好的API,很多时候无法满足需要,今天学习下一些底层的API调用,在此做下笔记,所有内容来自网络,自己整理了下,持续更新...1、APIENTRY,WINAPI,CALLBACK等是什么东西?2、HINSTANCE 、HANDLE 、HWND 、LPCTSTR是什么?3、CWnd 、CDC 与HDC?4、COLORREF 与RGB 、LPVOID 与LPCVOID?5、char、wchar_t、TCHAR、WCHAR、std::string、std::wstring、CString、LPCTSTR、DWORD6、SelectObject()和SelectStockObject()有何区别?1、APIENTRY,WINAPI,CALLBACK等是什么东西?通常在函数名前面(返回值后面)会有APIENTRY或WINAPI或CALLBACK修饰,这其实与调用约定有关.调用约定调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。

MFC支持以下调用约定:①_cdecl按从右至左的顺序压参数入栈,由调用者把参数弹出栈。

对于“C”函数或者变量,修饰名是在函数名前加下划线。

对于“C++”函数,有所不同。

如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。

这是MFC缺省调用约定。

由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。

②_stdcall按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。

对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。

对于“C++”函数,则有所不同。

所有的Win32 API函数都遵循该约定。

③_fastcall头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。

由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。

对于“C++”函数,有所不同。

未来的编译器可能使用不同的寄存器来存放参数。

④thiscall仅仅应用于“C++”成员函数。

this指针存放于CX寄存器,参数从右到左压栈。

thiscall不是关键词,因此不能被程序员指定。

⑤naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。

naked call不产生这样的代码。

naked call不是类型修饰符,故必须和_declspec共同使用,如下:__declspec(naked) int func(formal_parameters){// Function body}⑥过时的调用约定原来的一些调用约定可以不再使用。

它们被定义成调用约定_stdcall或者_cdecl。

例如:#define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cdecl#define APIENTRY WINAPI#define APIPRIVATE __stdcall#define PASCAL __stdcall2、HINSTANCE 、HANDLE 、HWND 、LPCTSTR是什么?HINSTANCE是进程句柄;HANDLE是对象句柄;HWND 是窗口的句柄。

LPCTSTR一个指向常固定地址的可以根据一些宏定义改变语义的字符串①其实句柄是一个32位的整数,WINDOWS操作系统用来标志一个对象,是进程、图像图标资源等对象的ID。

在Windows这样的多任务操作系统中,一个程序可以同时运行多个实例。

不同的实例间需要彼此区别,句柄就是干这个的。

②而在WinMain函数中,带有4个参数,分别是:hInstance, hPrevInstance, lpCmdLine, nShowCmd。

hInstance是程序的当前实例的句柄。

在Windows这样的多任务操作系统中,一个程序可以同时运行多个实例。

不同的实例间需要彼此区别,句柄就是干这个的。

③微软喜欢将内核对象标识,称为句柄。

如进程:HINSTANCE文件句柄:HANDLE窗口句柄:HWND画笔句柄:HPEN等等。

④LPCTSTR L实际是一个指向常固定地址的可以根据一些宏定义改变语义的字符串。

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中,long指针和near指针及far修饰符都是为了兼容的作用。

没有实际意义。

P表示这是一个指针,C表示是一个常量T在Win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。

STR表示这个变量是一个字符串。

所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。

同样,LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。

LPCTSTR == const TCHAR *LP和P在win32中是等效的,都是指针的意思。

PTSTR的定义typedef LPWSTR PTSTR, LPTSTR; STR表示字符串。

问题就出在T上面. T是一个宏,当没定义unicode时为空,定义unicode后表示为宽字符。

所以当定义unicode后,PTSTR转换为PSTR(LPSTR,一样意思)就不能直接转换了,因为一个是unicode,一个是ascii 结论:unicode下,PTSTR转换为PSTR是个编码转换问题。

编码转换可以用MS的函数完成。

WideCharToMultiByte将unicode转换成asciiMultiByteToWideChar将ascii转换成unicode⑤ Win32 API 调用小例子(注意,如果用VS类编译器,在新建项目时要选择"Win32项目",而不是控制台程序,如下图:)//#include "stdafx.h"//#include "First.h"#include <windows.h>#include <tchar.h>int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);UNREFERENCED_PARAMETER(hInstance);UNREFERENCED_PARAMETER(nCmdShow);//获取桌面的句柄。

HWND hWnd = GetDesktopWindow();//显示一行消息。

MessageBox(hWnd,_T("第一个应用程序"),_T("例子"), MB_OK);return 0;}上面的例子将会会弹出一个小提示框,如图:从上面这段程序就可以看到,_tWinMain是应用程序的入口函数,这里是使用它的宏,定义在tchar.h 头文件里,为什么要这样作宏定义的呢?由于Windows的应用程序要适应UNICODE和以前单字符的应用程序,由于Windows这两个API的定义是不一样的,如下:UNICODE的定义:#define _tWinMain wWinMain单字符的定义:#define _tWinMain WinMain只要经过这样的宏定义后,就可以适应不同字符宽度的函数接口了。

由于我是采用UNICODE编译的,所以这里使用wWinMain函数定义,下面再把它的定义找出来,如下:int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nShowCmd);这里要详细地解释一下函数wWinMain的参数,它有四个参数。

hInstance是当前应用程序的实例句柄,一般用来区分不同的资源使用。

hPrevInstance是以前Win98使用的句柄,在Win2000以后的操作系统里都是空值NULL。

lpCmdLine是命令行参数,比如你在Windows开始菜单里运行一个程序,并添加参数在后面,就会传递给应用程序,后面再详细讨论。

nShowCmd是窗口的显示方式,比如最大化显示,最小化显示,还是正常显示。

Windows运行程序时,是通过运行库里的启动代码来调用wWinMain函数,它是在启动文件里如下调用:#ifdef WPRFLAGmainret = wWinMain(#else /* WPRFLAG */mainret = WinMain(#endif /* WPRFLAG */(HINSTANCE)&__ImageBase,NULL,lpszCommandLine,StartupInfo.dwFlags & STARTF_USESHOWWINDOW? StartupInfo.wShowWindow: SW_SHOWDEFAULT);这就是操作系统传递给应用程序的值,现在就来演示使用第一个参数hInstance。

请看下面的例子:#include "stdafx.h"#include "First.h"int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);UNREFERENCED_PARAMETER(nCmdShow);//使用应用程序句柄const int MAXSIZE_APPBUF = 256;19 TCHAR wAppTile[MAXSIZE_APPBUF];20 LoadString(hInstance,IDS_APP_TITLE,wAppTile,MAXSIZE_APPBUF);//获取桌面的句柄。

相关文档
最新文档