win32设计菜单、点击显示弹出对话框(内含可实现源代码)
[Win32]一个调试器的实现(六)显示源代码
![[Win32]一个调试器的实现(六)显示源代码](https://img.taocdn.com/s3/m/6be91ce4988fcc22bcd126fff705cc1755275f88.png)
[Win32]⼀个调试器的实现(六)显⽰源代码作者:出处:本⽂版权归作者和博客园共有,欢迎转载。
但未经作者同意必须保留此段声明,且在⽂章页⾯明显位置给出原⽂连接,否则保留追究法律责任的权利。
上⼀篇⽂章介绍了调试符号以及DbgHelp的加载和清理,这回我们使⽤它来实现⼀个显⽰源代码的功能。
该功能的实际使⽤效果如下图所⽰:该功能不仅仅是显⽰源代码,还要显⽰每⼀⾏代码对应的地址。
实现该功能⼤概需要进⾏以下的步骤:①获取下⼀条要执⾏的指令的地址。
②通过调试符号获取该地址对应哪个源⽂件的哪⼀⾏。
③对于其它的⾏,通过调试符号获取它对应的地址。
第⼀步可以通过获取EIP寄存器的值来完成,相关的内容已经在第四篇⽂章中进⾏了讲解,这⾥不再重复。
下⾯讲⼀下如何实现第⼆个和第三个步骤。
获取源⽂件以及⾏号在调试符号中,记录了每⼀⾏源代码对应的地址。
通过DbgHelp的SymGetLineFromAddr64函数可以由地址获取源⽂件路径以及⾏号。
该函数的声明如下:1 BOOL WINAPI SymGetLineFromAddr64(2 HANDLE hProcess,3 DWORD64 dwAddr,4 PDWORD pdwDisplacement,5 PIMAGEHLP_LINE64 Line6 );hProcess参数是符号处理器的标识符,dwAddr是指令的地址。
pdwDisplacement是⼀个输出参数,⽤于获取dwAddr相对于它所在⾏的起始地址的偏移量,以字节为单位。
之所以需要这么⼀个参数,是因为⼀⾏代码可能对应多条汇编指令,有了它就可以知道下⼀条要执⾏的指令位于这⼀⾏代码的哪个位置。
例如,int b = 3 * a + a;这⾏代码对应以下的汇编指令:1 8B 45 F8 mov eax,dword ptr [a]2 6B C0 03 imul eax,eax,33 03 45 F8 add eax,dword ptr [a]4 89 45 EC mov dword ptr [b],eax如果分别以这四条指令的地址调⽤SymGetLineFromAddr64函数,那么通过pdwDisplacement返回的值分别是0,3,6和9。
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位。
win32编程(3):对话框机制

win32编程(3):对话框机制
接上文,可见,一个win32的GUI程序的套路是,编写消息循环,创建窗口类,实例化窗口,处理用户行为触发的窗口消息。
这个过程是很清晰的,但每次都这样,说到底还是有些单调乏味,于是,windows对这个过程做了进一步的精简,他精减的方式很直观,就是替你写好,先写一个消息循环,也创建一个预定的窗口类(对话框类)并把此包装成函数,这样你调用此函数便达到了书写最简便的win32程序的目的。
这就是对话框机制的目的。
当然在使用时,可能没有用其消息循环,而只是使用了其对话框类。
pe可执行文件格式是windows默认的可执行文件格式,该格式从直观来说,和早期unix可执行程序的最大区别在于,资源(图片等)可以被打包进可执行文件里,我个人认为这是个好事儿,编过unix程序的可能会有所感悟,unix下程序和资源是分离的,一个程序最后会有一大堆散落在各地的文件,管理不便。
而windows下,只要你愿意,你可以把所有东西都打包进一个exe可执行文件里。
方便管理。
对话框类是系统编写好的一种窗口类,其样子可以来自于一种pe 可执行文件的资源:对话框资源。
这就为界面设计和代码分离提供了可能性,事实上win32下,几乎所有编程软件,vc,delphi,c++ builder 都有对话框设计器。
到了.net的windows form时代,把这一方便的模式发挥到了极致。
win32窗口程序代码模板

win32窗⼝程序代码模板#include <windows.h>#include <commctrl.h>#include "tchar.h"LRESULT CALLBACK xiaoxichuli(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HWND hwndButton;HWND hAnmate; //按钮的句柄switch (message){case WM_CREATE:/****************************创建控件的部分**************************************///创建窗⼝的时候要做的事情hwndButton = CreateWindow(TEXT("BUTTON"), TEXT("喵"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 10, 10, 100, 30, hwnd, (HMENU)1/*给按钮⼀个ID为1*/, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //CreateWindow(TEXT("static"),TEXT("Sta1111111111"),WS_CHILD|WS_VISIBLE|SS_CENTER,100,100,300,200,hwnd,(HMENU)2, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//SetWindowText(hwndButton, TEXT("NEW"));hAnmate = CreateWindow(ANIMATE_CLASS,TEXT("AC"),WS_CHILD|WS_VISIBLE|ACS_CENTER|ACS_AUTOPLAY,30,50,300,300,hwnd,(HMENU)3, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);SendMessageA(hAnmate, ACM_OPEN, NULL, (LPARAM)L"G:\\CPro\\Project1\\Debug\\IMG_0013.avi");break;/****************************处理事件消息部分*************************************/case WM_COMMAND:if (LOWORD(wParam) == 1) //响应ID为1的消息{MessageBox(hwnd, TEXT("来戳我吖!"), TEXT("喵吖喵"), MB_OK);//跳⼀个卖萌的消息框出来}break;/********************************************************************************/case WM_DESTROY:// 在消息队列中插⼊⼀个[退出程序]消息PostQuitMessage(0);break;default:return DefWindowProc(hwnd, message, wParam, lParam);}// 执⾏内定的消息处理return 0;}int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){static char szAppName[] = TEXT("喵");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = xiaoxichuli;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);// 加载图标供程序使⽤ IDI-图⽰IDwndclass.hCursor = LoadCursor(NULL, IDC_SIZENWSE);// 加载⿏标光标供程序使⽤ IDC-游标IDwndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //GetStockObject 取得⼀个图形对象(此例中是取得窗⼝背景的画刷对象)wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;// 注册窗⼝if (!RegisterClass(&wndclass)) //如果程序类没法注册的话{MessageBox(NULL, TEXT("程序⽆法运⾏"), szAppName, MB_ICONERROR);return 0;}//根据窗⼝类别 WndClass 建⽴⼀个窗⼝hwnd = CreateWindow(szAppName, TEXT("喵~"), WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL);// 在屏幕上显⽰窗⼝ShowWindow(hwnd, iCmdShow);// 指⽰窗⼝⾃我更新UpdateWindow(hwnd);// 从消息队列中取得消息while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}。
python和pywin32实现窗口查找、遍历和点击的示例代码

python和pywin32实现窗⼝查找、遍历和点击的⽰例代码Pywin32是⼀个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接⼝、线程以及COM机制等等。
1.通过类名和标题查找窗⼝句柄,并获得窗⼝位置和⼤⼩import win32guiimport win32apiclassname = "MozillaWindowClass"titlename = "百度⼀下,你就知道 - Mozilla Firefox"#获取句柄hwnd = win32gui.FindWindow(classname, titlename)#获取窗⼝左上⾓和右下⾓坐标left, top, right, bottom = win32gui.GetWindowRect(hwnd)2.通过⽗句柄获取⼦句柄def get_child_windows(parent):'''获得parent的所有⼦窗⼝句柄返回⼦窗⼝句柄列表'''if not parent:returnhwndChildList = []win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), hwndChildList)return hwndChildList#获取某个句柄的类名和标题title = win32gui.GetWindowText(hwnd)clsname = win32gui.GetClassName(hwnd)#获取⽗句柄hwnd类名为clsname的⼦句柄hwnd1= win32gui.FindWindowEx(hwnd, None, clsname, None)3.⿏标定位与点击#⿏标定位到(30,50)win32api.SetCursorPos([30,150])#执⾏左单键击,若需要双击则延时⼏毫秒再点击⼀次即可win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#右键单击win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)4.发送回车键win32api.keybd_event(13,0,0,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)5.关闭窗⼝win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)win32gui遍历窗⼝并设置窗⼝位置import win32guiimport win32condef reset_window_pos(targetTitle):hWndList = []win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)for hwnd in hWndList:clsname = win32gui.GetClassName(hwnd)title = win32gui.GetWindowText(hwnd)if (title.find(targetTitle) >= 0): #调整⽬标窗⼝到坐标(600,300),⼤⼩设置为(600,600)win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 600,300,600,600, win32con.SWP_SHOWWINDOW)reset_window_pos("windowName")到此这篇关于python和pywin32实现窗⼝查找、遍历和点击的⽰例代码的⽂章就介绍到这了,更多相关pywin32 窗⼝查找、遍历和点击内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
用C语言设计Win32程序(附C语言设计QQ登陆界面实例)

用C语言设计Win32程序(附C语言设计QQ登陆界面实例)C语言的基本语法我是不打算再提了,很多C语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就是一些数值计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且也没有多少实用价值。
本书以实用实例作为编程指导,指引大家编写真正实用的程序。
了解到大家对黑客程序、病毒、窗口类程序比较感兴趣,因此我就拿这些实例进行讲解。
基于大家基本都用Windows XP SP3,我也就在这个系统上把程序调试成功后再给大家讲解。
编程环境,我还是喜欢Visual C++ 6.0本书计划从四个大的方面来讲,这四个方面是:窗口类、文件操作类、网络类、数据库类。
都是时下流行的编程必备技术,也是软件开发者,必须掌握的技术。
中间以实例讲解,逐步学习,相信大家看完后会有很大的提高的。
第一章窗口类程序的编写这一章就先来讲解下窗口类程序的编写。
因为现在程序没有界面,就像人没有脸面一样,而且好的界面更能吸引人。
从基本的界面开始,相信能给大家指明出一条路的,使大家很容易地掌握窗口序的编写。
其实界面设计利用VC 6.0 的MFC,很容易地制作出来。
这里从底层开始写代码来写界面程序,使大家知道一些底层的东西,为以后学习打下好的基础,相信您学了这些,再用VC 的MFC会得心应手的。
1.1用 C 写的第一个一个窗口程序作为编程的开始,我们还是以一个Hello World来开始我们的学习之旅。
代码如下:#include <stdio.h>void main(){printf("Hello World!");}这是一个再简单不过的C程序了,只要有点C语言的知识就能够懂的,不过这里估计还有些人,到现在还不知道#include<stdio.h>中的头文件stdio.h到底是什么东西,我就来说下了,stdio.h是一个文本文件,存在于磁盘上的,已VC为例它的位置如下图:也许你听说过printf()函数是在stdio.h中预定义的,但是你见过其定义的形式没有,没有且看下图其定义形式,就如图中所示,也许你并不懂前面那些东西是什么,不用担心,以后我会慢慢解释给大家的。
Win32开发入门(14):用对话框作为主窗口

Win32开发入门(14):用对话框作为主窗口前面我们在编写Win32应用程序的思路都是:1、设计窗口类。
2、注册窗口类。
3、创建窗口。
……然而,当我们接触控件以后,会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编辑器,操作起来相对方便。
于是,就有了一个想法:把对话框用作主窗口,那我们在布局控件时就轻松了。
其实这想法在网上已有牛人做了,不过,人家是用 Win32汇编干的,当然,要把它变为C++就更简单了。
首先,介绍第一个法子,直接以桌面作为父窗口来创建对话框。
1、创建一个对话框资源,界面就发挥你的设计天赋了。
2、创建一个图标资源,既作为应用程序的图标(VS编译时会选择第一个添加到资源中的图标作为EXE的图标),也作为对话框的图标。
3、在代码中创建并显示对话框。
#include <Windows.h>#include "resource.h"// 开启可视化效果#pragma comment(linker,"\"/manifestdependency:type='win32' \name='mon-Controls' version='6.0.0.0' \processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);HINSTANCE hgInst;int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow){hgInst = hThisApp;HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc);if(!hdlg){return 0;}ShowWindow(hdlg,SW_SHOW);MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {switch(msg){case WM_INITDIALOG:// 设置对话框的图标SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst,MAKEINTRESOURCE(IDI_APP)));return 0;case WM_SYSCOMMAND:if(wParam == SC_CLOSE){PostQuitMessage(0);//退出}return 0;}return (INT_PTR)FALSE;}。
Win32教程2-消息框

.data
.code
start:
invoke ExitProcess,0
end start
option casemap:none 一句的意思是告诉 MASM 要区分标号的大小写,譬如:start 和 START 是不同的。请注意新的伪指令 include,跟在其后的文件名所指定的文件在编译时将“插”在该处。在我们上面的程序段中,当MASM处理到语句 include \masm\include\windows.inc 时,它就会打开文件夹\MASM32\include 中的文件windows.inc,这和您把整个文件都粘贴到您的源程序中的效果是一样的。 hutch 的 windows.inc 包含了 WIN32 编程所需要的常量和结构体的定义。 但是它不包含函数原型的定义。尽管 hutch 和我尽力包含所有的常量和结构体的定义,但仍会有不少遗漏,为此我们将不断加入新的内容。请随时注意我们主页,下载最新的头文件。
接下来我们来看看 includelib 伪指令,和 include 不同,它仅仅是告诉编译器您的程序引用了哪个库。当编译器处理到该指令时会在生成的目标文件中插入链接命令告诉链接器链入什么库。当然您还可以通过在链接器的命令行指定引入库名称的方法来达到和用includelib指令相同的目的,但考虑到命令行仅能够传递128个字符而且要不厌其烦地在命令行敲字符,所以这种方法是非常不可取的。
call ExitProcess
若您事先没把一个DWORD类型参数压入堆栈,编译器和链接器都不会报错,但毫无疑问,在您的程序运行时将引起崩溃。但是,当您这样写:
invoke ExitProcess
连接器将报错提醒您忘记压入一个 DWORD 类型参数。所以我建议您用 INVOKE 指令而不是CALL去调用一个函数。INVOKE 的语法如下:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业课程实验报告
课程名称:windows程序设计
开课学期: 2015至2016 学年第1学期专业:计算机科学与技术年级班级:2013级
学生姓名:刘敏学号:222013*********
实验教师:刘红俊
计算机与信息科学学院软件学院
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2);
2.对话框资源及其应用:
1)模式对话框:
①定义对话框资源:
资源文件中如此定义对话框资源:
对话框名 DIALOGEX x,y,weight,hight
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION ""
FONT 9, ""
BEGIN
对话框的控件定义
END
②调用函数DiaLogBox显示对话框;
③构造对话框消息处理函数;
④关闭对话框。
2)非模式对话框:
①定义非模式对话框:
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU|WS_VISIBLE
②创建对话框函数:
HWND CreateDialog{hInst, MAKEINTRESOURCE(IDD_SHOWBOX),hWnd,(DLGPROC)DlgProc}
③消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
④关闭对话框:
DestroyWindow(hDlg);
3)程序加载图标:
IDI_WIN32PROJECT2 ICON "Win32Project2.ico"
IDI_SMALL ICON "small.ico"
(三)程序代码:
Win32Project2.cpp
// Win32Project2.cpp : 定义应用程序的入口点。
//
#include"stdafx.h"
#include"Win32Project2.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM); //定义对话框处理函数
HWND hDlg; //对话框句柄
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT2));
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
三、测试数据和执行结果(在给定数据下,执行操作、算法和程序的结果,可使用数据、图表、截图等给出)
图1
图2
四、实验结果分析及总结(对实验的结果是否达到预期进行分析,总结实验的收获和存在的问题等)
(一)实验结果:
实验结果达到预期要求。
(二)实验收货:
1.通过此次试验,我掌握了资源在windows编程中的应用。
2.学习了菜单资源及其应用;
3.模式对话框与非模式对话框资源及其应用;
4.图标资源及其应用。
(三)存在的问题:
在此实验中,单击菜单中的显示会弹出非模式对话框,但是我只能通过单击隐藏来关闭对话框,单击对话框中的叉并不能关闭对话框。
实验内容和设计(A-E):。