win32设计菜单、点击显示弹出对话框(内含可实现源代码)
[Win32]一个调试器的实现(六)显示源代码
[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 的语法如下:
win32gui用法
win32gui用法Win32 GUI编程是Windows平台下一种重要的开发方式,通过使用Win32 GUI库,我们可以创建具有图形用户界面(GUI)的应用程序。
其中,win32gui是Python中一个常用的GUI库,它提供了丰富的API,方便我们进行GUI开发。
一、win32gui库介绍win32gui库是Python中用于Windows平台下进行GUI开发的库,它提供了丰富的API,包括窗口、控件、消息、图标、位图等操作接口。
通过使用win32gui库,我们可以方便地进行窗口创建、消息处理、控件操作等GUI开发工作。
二、win32gui基本用法1. 导入win32gui库在使用win32gui库之前,需要先导入它。
在Python中,可以使用`import win32gui`语句来导入该库。
2. 创建窗口使用win32gui库创建窗口需要使用`win32gui.CreateWindow()`函数。
该函数需要传入窗口的类名、窗口的样式、窗口的父窗口等参数。
创建窗口后,可以通过调用其他函数来设置窗口的位置、大小、标题等信息。
示例代码:```pythonimport win32guiwindow_class = "MyWindowClass"window_style = win32con.WS_OVERLAPPEDWINDOW |win32con.WS_VISIBLEwindow_rect = (0, 0, 640, 480)window_proc = win32gui.WNDPROC()win32gui.RegisterClass(window_class)window = win32gui.CreateWindow(window_class, "My Window Title", window_style, window_rect, None, None, None, None, None)```3. 发送消息使用win32gui库可以发送各种消息到窗口中,例如WM_PAINT消息用于绘制窗口内容,WM_CLOSE消息用于关闭窗口等。
Win32程序开发入门:一个最简单的Win32程序
Win32程序开发⼊门:⼀个最简单的Win32程序⼀、什么是 Win32Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境。
这⾥再介绍下 Win32 Application 和 Win32 Console Application 之间的区别:1、程序不同Win32 Application 是标准 windows 程序,完全拥有 windows 的特性,可以通过⿏标点击窗⼝来完成控制。
Win32 Console Application 是控制台应⽤程序,类似于 MS-DOS 窗⼝,只能运⾏命令⾏程序,不具备消息响应机制。
2、⼊⼝函数不同Win32 Application ⼊⼝函数是 WinMain(),它具有消息响应机制,可以运⾏图形化的 C++ 程序。
Win32 Console Application ⼊⼝函数是 main(),可以访问部分 windows API 函数,如果你编写传统的 C 程序,必须建⽴ Win32 Console 程序。
⼆、最简单的程序创建⼀个 win32 应⽤程序⼯程,功能是显⽰⼀个消息框,随便提⽰⼀些⽂字就可以了。
具体的创建⼯程的步骤可以参考:。
代码如下:#include <Windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){MessageBox(NULL,TEXT("随便提⽰⼀些内容就可以了!哈哈哈!"), // 内容TEXT("这⾥是标题!"), // 标题名称0);return 0;}我们再看⼀下效果:接下来我们从头开始剖析这个简单的⼩程序。
三、分析⼀下3.1 头⽂件#include <Windows.h>windows.h 是⼀个最重要的包含⽂件,它囊括了若⼲其他 Windows 头⽂件,其中的某些头⽂件⼜包含另外的⼀些头⽂件。
自动弹出窗口代码(Autopopupwindowcode)
自动弹出窗口代码(Auto popup window code)Guided reading:Since the Microsoft Corp launched Windows 95 operating system, system tray applications as an attractive user interface design, by the vast number of users. Windows applications that use the system tray as a user interface are numerous, such as PowerWord, Winamp, RealPlayer, and so forth.Do not display these running Windows running, only display an icon on the taskbar, said the program is running, the user can interact with the mouse application developers sometimes need to prepare just in a similar program running in the background, in order to run the interface does not interfere in front of the program and display the unnecessary window. The main window is not visible when the program is running. At the same time, an icon is displayed in the static notification area in the right side of the taskbar and responds to the user's mouse action. The design method of this example introduces Visual C++ development for this type of program, after compiling the program to run, if you double-click the tray icon, the program will be a message list window pops up, as long as the mouse moves over the tray icon or click (both right and left key click or double-click), produced by the message will be displayed in the window; when the mouse cursor moves to the tray icon, will display a message on the icon near; right-click pop-up context menu, open the property page should contain commands or other open windows and the icon associated with the menu command, in addition, the program can also change the tray dynamic icon. With this example, it is believed that readers can easily and easily use the system tray in their programs.First, the realization methodIn order to realize the tray procedures, the main window first to make the program is not visible, this realization is very easy, as long as the call ShowWindow (SW_HIDE) can be, the examples of the use of this method, there is a way to hide the main frame by setting a main frame window style and extended style:BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT&, CS){Cs.style =WS_POPUP; / / the main window is not visible;Cs.dwExStyle =WS_EX_TOOLWINDOW; / / does not display the task button;Return CFrameWnd:: PreCreateWindow (CS);}To display icons on the taskbar, use the system API function Shell_NotifyIcon () to display an icon in the notification area of the taskbar. The prototype of this function is:BOOL Shell_NotifyIcon (DWORD, dwMessage, PNOTIFYICONDATA, pnid);The first parameter of this function, dwMessage, is DWORD,which represents the action to be performed. It can be one of the following values:NIM_ADD: add an icon to the taskbar.NIM_MODIFY: modify the icon in the status bar area.NIM_DELETE: deletes the icon in the status bar area.NIM_SETFOCUS: returns the focus to the taskbar notification area. When the user interface operation is completed, the taskbar icon must use this message. For example, if the taskbar icon is displaying the context menu, but the user presses the "ESCAPE" button to cancel the operation, then the message must be returned to the taskbar notification area with this message.NIM_SETVERSION: indicates that the taskbar works in accordance with the corresponding dynamic library version.The second parameter, pnid, is the address of the NOTIFYICONDATA structure, whose content depends on the value of the dwMessage. This structure is defined in the SHELLAPI.H file as follows:Typedef, struct, _NOTIFYICONDATA {DWORD cbSize; / / structure size (sizeof struct), must be set upHWND hWnd; / / the window handle to send notification messagesUINT uID; / / ID icon (specified by the WPARAM callback function)UINT uFlags;UINT uCallbackMessage; / / the message is sent to a window procedureHICON hIcon; / / the taskbar icon handlechar sztip [64]; / / 提示文本notifyicondata};该结构中uflags的值分别为:# define nif _ message 0x1 / / 表示ucallbackmessage 有效# define nif _ icon 0x2 / / 表示hicon 有效# define nif _ tip 0x4 / / 表示sztip 有效在该结构的成员中, cbsize为该结构所占的字节数, hwnd为接受该图标所发出的消息的窗口的句柄 (鼠标在任务栏上程序图标上动作时图标将发出消息, 这个消息用户要自己定义), uid为被显示图标的id, uflags指明其余的几个成员 (hicon、ucallbackmessage和sztip) 的值是否有效, ucallbackmessage为一个用户自定义的消息, 当用户在该图标上作用一些鼠标动作时, 图标将向应用程序的主框架窗口 (hwnd成员中指定的窗口) 发出该消息, 为了使程序的主框架得到该通知消息, 需要设置notifyicondata 结构的flag成员的值为nif _ message.hicon为将在任务栏上显示的图标句柄, sztip鼠标停留在该图标上时显示的提示字符串.尽管shell _ notifyicon函数简单实用, 但它毕竟是个win32 api, 为此本实例将它封装在了一个c + + 类中, 这个类叫做ctrayicon, 有了它, 托盘编程会更加轻松自如, 因为它隐藏了notifyicondata、消息代码、标志以及一些繁琐的细节.二、编程步骤1、启动visual c + + 6.0, 生成一个单文档的应用程序traytest, 取消文档视图支持;2、在cmainframe类中添加自定义消息 # define wm _ my _ tray _ notification wm _ user + 0, 并在该类中为此自定义消息手动添加消息映射on _ message (wm _ my _ tray _ notification, ontraynotification) 和消息响应函数afx _ msg lresult ontraynotification (wparam wp, lparam lp);3、设计二个图标添加到项目中, 其id标志分别为 "idi _ myicon" 、 "idi _ myicon2", 作为托盘显示时的图标;4、在cmainframe类中添加下述变量: ctrayicon m _ trayicon (用来操作图标的类对象) 、cedit m _ wndedit (编辑框用来显示所跟踪到的鼠标消息) 、int m _ iwhichicon (决定当前托盘使用哪个图标) 、bool m _ bshutdown (是否关闭当前拖盘程序标志) 、bool m _ bshowtraynotifications (是否显示托盘消息标志);5、为程序的idr _ mainframe添加处理菜单项和托盘的上下文菜单idi _ trayicon (具体的菜单项的标题和id标志符参见代码部分), 然后使用class wizard为各个菜单项添加处理函数;6、添加代码, 编译运行程序./ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ctrayicon类的头文件;# ifndef _ trayicon _ h# define _ trayicon _ hclass ctrayicon: public ccmdtarget {protected:dead _ dynamic (ctrayicon)notifyicondata m _ nid; / / struct for shell _ notifyicon argspublic:ctrayicon (uint wool);~ ctrayicon ();/ / call this two receive tray notificationsvoid setnotificationwnd (cwnd * pnotifywnd, uint ucbmsg);all seticon (uint wool); / / main variant you want to usebool seticon (hicon hicon, lpcstr lptip);bool seticon (lpctstr lpresname, lpcstr lptip){return seticon (lpresname?afxgetapp () - > loadicon (lpresname): null, lptip);}bool setstandardicon (lpctstr lpsziconname, lpcstr lptip) {return seticon (:: loadicon (null, lpsziconname), lptip);}virtual lresult ontraynotification (wparam uid, lparam levent);};# endif/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ctrayicon类的.cpp文件# includes "stdafx.h"# includes "trayicon.h"# include / / for afxloadstringimplement _ dynamic (ctrayicon, ccmdtarget)ctrayicon: ctrayicon (int uid){memset (a & m _ nid, 0, sizeof (m _ nid)); / / initialize notifyicondatam _ nid.cbsize = sizeof (m _ nid).m _ nid.uid = uid; / / never changes after constructionafxloadstring (uid, m _ nid.sztip, sizeof (m _ nid.sztip));/ / use resource string as tip if there is one.}ctrayicon:: ~ ctrayicon (){seticon (0); / / remove icon from system tray}void ctrayicon: setnotificationwnd (cwnd * pnotifywnd, int ucbmsg){/ / set notification window. it must created already.assert (pnotifywnd = = null) iswindow (pnotifywnd - >getsafehwnd ()));m _ nid.hwnd = pnotifywnd - > getsafehwnd ();assert (ucbmsg = = 0 ucbmsg > = _ wm user).m _ nid.ucallbackmessage = ucbmsg;}bool ctrayicon: seticon (int uid){/ / sets both the icon and tooltip from resource id, to remove the icon, call seticon (0)hicon hicon = null;if (uid) {afxloadstring (uid, m _ nid.sztip, sizeof (m _ nid.sztip));hicon = afxgetapp () - > loadicon (uid).}return seticon (hicon, null).}bool ctrayicon: seticon (hicon hicon, lpcstr lptip){/ / common seticon for all overloads.int msg.m _ nid.uflags = 0;if (hicon) {/ / set the iconmsg = m _ nid.hicon? nim _ modify: nim _ add;m _ nid.hicon = hicon; / / add or replace the icon in the system traym _ nid.uflags = nif _ icon.} else {if (m _ nid.hicon = = null) / / remove icon from trayreturn true; / / already deletedmsg = nim _ delete;}if (lptip) / / use the tip, if anystrncpy (m _ nid.sztip, lptip, sizeof (m _ nid.sztip));if (m _ nid.sztip [0])m _ nid.uflags = nif _ tip;if (m _ nid.ucallbackmessage & & m _ nid.hwnd) / / use callback if anym _ nid.uflags = nif _ message;Bool BRET = shell _ NotifyIcon (MSG, & M _ NLD); / / do it.If (MSG = = NIM _ delete! BRET)M _ nid.hicon = null; / / failedReturn BRET;}Lresult ctrayicon: ontraynotification (wParam wid, lParam Levent){If (wid. = m _ nid.uid (Levent. = WM _ rbuttonup & Levent. = WM _ LBUTTONDBLCLK))Return 0;Cmenu menu; / / 装载上下文菜单;If (! Menu.loadmenu (m _ nid.uid))Return 0;Cmenu * psubmenu = menu.getsubmenu (0);If (! Psubmenu)Return 0;If (Levent = = WM _ rbuttonup) {/ / 设置第一个菜单项为默认菜单项目:: setmenudefaultitem (psubmenu - > m _ HMENU, 0, true);/ / 将当前菜单作为上下文菜单;CPoint mouse;GetCursorPos (& mouse);:: SetForegroundWindow (m _ nid.hwnd);:: trackpopupmenu (psubmenu - > m _ HMENU, 0, mouse.x, mouse.y, 0, m _ nid.hwnd, null);} else / double click Run first menu item::: SendMessage (m _ nid.hwnd, WM _ command, psubmenu - > getmenuitemid (0), 0);Return 1;}/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / mainfrm.h: interface of the CMainFrame class# if. Defined (AFX _ MainFrm _ h _ _ 9ed70a69 _ c975 _ 4f20 _ 9d4e _ b2877e3575d0 _ _ included _)# defines AFX _ MainFrm _ h _ _ 9ed70a69 _ c975 _ 4f20 _ 9d4e _ b2877e3575d0 _ _ included _# if _ MSc _ see > 1000# pragma once# ENDIF / _ MSc _ see > 1000# include "trayicon.h"Class CMainFrame: public CFrameWnd{Public:CMainFrame ();Protected:Declare _ dynamic (CMainFrame)/ / attributesPublic:/ / overrides/ / ClassWizard generated virtual function overrides / / {{AFX _ virtual (CMainFrame)/ /}} AFX _ virtual/ / implementationPublic:Virtual ~ CMainFrame ();# ifdef _ debugVirtual void assertvalid () const;Virtual void dump (cdumpcontext & DC) const;# endifD: / / control bar embedded membersCStatusBar m _ wndstatusbar;Ctrayicon m _ TrayIcon; / / my tray iconCEdit m _ wndedit; / / to the display tray notificationsInt m _ iwhichicon; / / which HiCON to useBool m _ bshutdown; / / OK to terminate traytestBool m _ bshowtraynotifications; / / display info in main window / / generated message map functions.Protected:/ / {{AFX _ MSG (CMainFrame)AFX _ MSG lresult ontraynotification (wParam WP, lParam LP); AFX _ MSG int oncreate (lpcreatestruct lpcreatestruct); AFX _ MSG void ontoggleicon ();AFX _ MSG void onviewclear ();AFX _ MSG void onviewnotifications ();AFX _ MSG void onupdateviewclear (ccmdui * pcmdui);AFX _ MSG void onupdateviewnotifications (ccmdui * pcmdui);AFX _ MSG void onclose ();AFX _ MSG void onappopen ();AFX _ MSG void onappsuspend ();/ / note the ClassWizard will add and delete member functions here./ / do not edit what you see in these blocks of generated code./ /}} AFX _ MSGDeclare _ message _ map ()};/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / cmainfrm.cpp# include "stdafx.h"# include "traytest.h"# include "mainfrm.h"# ifdef _ debug# defines new debug _ NEW# undef this _ fileThe static char this _ file [] = _ _ file _ _;# endifLresult ctrayicon: ontraynotification (wParam wid, lParam Levent){If (wid. = m _ nid.uid (Levent. = WM _ rbuttonup & Levent. = WM _ LBUTTONDBLCLK))Return 0;Cmenu menu; / / 装载上下文菜单;If (! Menu.loadmenu (m _ nid.uid))Return 0;Cmenu * psubmenu = menu.getsubmenu (0);If (! Psubmenu)Return 0;If (Levent = = WM _ rbuttonup) {/ / 设置第一个菜单项为默认菜单项目:: setmenudefaultitem (psubmenu - > m _ HMENU, 0, true);/ / 将当前菜单作为上下文菜单;CPoint mouse;GetCursorPos (& mouse);:: SetForegroundWindow (m _ nid.hwnd);:: trackpopupmenu (psubmenu - > m _ HMENU, 0, mouse.x, mouse.y, 0, m _ nid.hwnd, null);} else / double click Run first menu item::: SendMessage (m _ nid.hwnd, WM _ command, psubmenu - > getmenuitemid (0), 0);Return 1;}/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / mainfrm.h: interface of the CMainFrame class# if. Defined (AFX _ MainFrm _ h _ _ 9ed70a69 _ c975 _ 4f20 _ 9d4e _ b2877e3575d0 _ _ included _)# defines AFX _ MainFrm _ h _ _ 9ed70a69 _ c975 _ 4f20 _ 9d4e _ b2877e3575d0 _ _ included _# if _ MSc _ see > 1000# pragma once# ENDIF / _ MSc _ see > 1000# include "trayicon.h"Class CMainFrame: public CFrameWnd{Public:CMainFrame ();Protected:Declare _ dynamic (CMainFrame)/ / attributesPublic:/ / overrides/ / ClassWizard generated virtual function overrides/ / {{AFX _ virtual (CMainFrame)/ /}} AFX _ virtual/ / implementationPublic:Virtual ~ CMainFrame ();# ifdef _ debugVirtual void assertvalid () const;Virtual void dump (cdumpcontext & DC) const;# endifD: / / control bar embedded membersCStatusBar m _ wndstatusbar;Ctrayicon m _ TrayIcon; / / my tray iconCEdit m _ wndedit;/ / to display tray notificationsint m _ iwhichicon; / / which successful hicon to use bool m _ bshutdown; / / ok to terminate traytestbool m _ bshowtraynotifications; / / display information in main window/ / / / / / / / generated message map functionsprotected:/ / / / / / / / (_ msg (cmainframe (afx)afx _ msg lresult ontraynotification (wparam wp, lparam lp).afx _ msg int oncreate (lpcreatestruct lpcreatestruct).afx _ msg for ontoggleicon ().afx _ msg for onviewclear ().afx _ msg for onviewnotifications ().afx _ msg for onupdateviewclear (ccmdui * pcmdui).afx _ msg for onupdateviewnotifications (ccmdui * pcmdui).afx _ msg for onclose ().afx _ msg for onappopen ().afx _ msg for onappsuspend ()./ / note: the classwizard will add and remove the functionshere./ / do not allow what you see in these blocks of generated code.afx _ msg /}}said _ message _ (map)};/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / cmainfrm.cpp# include "stdafx.h"# include "traytest.h"# include "mainfrm.h"# _ ifdef debug# define new debug _ newthe # undef _ filestatic char this _ file [] = _ _ _ _ lead.# endif/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / / / / / / / cmainframe diagnostics# _ ifdef debugvoid cmainframe: assertvalid () const{cframewnd: assertvalid ().}void cmainframe: dump (cdumpcontext & cd)){cframewnd: dump (dc).}# endif / _ debug/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / / / / / /bool cmyapp initinstance ():{/ / / / / / / / / / / / / / 在应用程序初始化函数中将程序的主框架隐藏起来.# ifdef _ afxdllenable3dcontrols (); / / call this when using mfc in a shared dll# elseenable3dcontrolsstatic (); / / call the statically when linking to mfc# endifsetregistrykey (_ (local appwizard generated applications ").cmainframe * pframe = new cmainframe.m _ pmainwnd = pframe.pframe - > loadframe (idr _ mainframe._ overlappedwindow (fws _ addtotitle, null, null);pframe - > showwindow (sw _ hide).pframe - > updatewindow ().return true;}四、小结托盘程序的信息提示通常是将鼠标光标移到托盘图标上之后, windows会发送消息给托盘程序, 从而显示提示信息 - tooltip.但在windows xp中我们还看到有些系统托盘程序是自动显示tooltips 信息的, 也就是说不用将鼠标光标移到托盘图标上便可显示tooltips.This new information tip is commonly referred to as a balloon cue, which is controlled by your program. Balloon hints provide a non intrusive way for tray programs to notify the user of something that happened. But how do you show the balloon tips? In fact, all tray icons are operated by a simple API function called Shell_NotifyIcon. You can use the parameter NOTIFYICONDATA structure of this function to tell Windows what you want to do. The following is the latest version of the definition of this structure (For IE5.0+), where new members have been added:Typedef, struct, _NOTIFYICONDATA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage; HICON hIcon;#if (_WIN32_IE, <0x0500) WCHAR szTip[64];#elseWCHAR szTip[128];#endif#if (_WIN32_IE = 0x0500) DWORD dwState;DWORD dwStateMask; WCHAR szInfo[256]; Union {UINT uTimeout;UINT uVersion;} DUMMYUNIONNAME;WCHAR szInfoTitle[64];DWORD dwInfoFlags;#endif} NOTIFYICONDATA, *PNOTIFYICONDATA;One of the symbols in NOTIFYICONDATA.uFlags is NIF_TIP, which uses it to set up traditional information tips, that is, the mouse moves on the icon. The new logo of NIF_INFO (due to_WIN32_IE > = 0x0500 is defined at compile time, therefore, please note that contains the latest version of the shellapi.h file, and ensure that links to the latest version of the shell32.lib library file, distribution program with the latest version of the runtime dynamic link library shell32.dll) is used to show that the balloon. That is, to display balloon hints, you must use the NIF_INFO flag when calling theShell_NotifyIcon function. The prompt text is filled into the szInfo field, and the title text is filled in szInfoTitle. You can even set a timeout time in NOTIFYICONDATA.uTimeout, and when the specified number of milliseconds, the balloon tip is automatically hidden.。
python和pywin32实现窗口查找、遍历和点击
python和pywin32实现窗口查找、遍历和点击1.如何利用句柄操作windows窗体首先,获得窗体的句柄 win32api.FindWindows()第二,获得窗体中控件的id号,spy++第三,根据控件的ID获得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)最后,利用控件句柄进行操作python可以通过win32api轻松获取控件的属性值通过标签找到主窗口句柄,然后通过主句柄获取下属控件句柄#-*- coding: utf-8 -*- ##设置编码方式import win32api,win32gui,win32conlabel = 'tt' #此处假设主窗口名为tthld = win32gui.FindWindow(None, label)if hld > 0:dlg = win32api.FindWindowEx(hld, None, 'Edit', None)#获取hld下第一个为edit控件的句柄buffer = '0' *50len = win32gui.SendMessage(dlg, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度win32gui.SendMessage(dlg, win32con.WM_GETTEXT, len, buffer) #读取文本print buffer[:len-1]#虚拟鼠标点击按钮(或者回车)btnhld = win32api.FindWindowEx(hld, None,'Button', None) # win32gui.PostMessage(btnhld, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)# win32gui.PostMessage(btnhld, win32con.WM_KEYUP, win32con.VK_RETURN, 0)win32gui.PostMessage(btnhld,win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0) win32gui.PostMessage(btnhld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)#获取显示器屏幕大小width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)#点击窗口buttonw=win32ui.FindWindow(clsname,windowtitle)b=w.GetDlgItem(窗口id)b.postMessage(win32con.BM_CLICK)#关闭窗体import win32uiimport win32conwnd=win32ui.FindWindow(classname,None)wnd.SendMessage(win32con.WM_CLOSE) 成功!import win32uiw=win32ui.FindWindow(classname,窗体title)print w.GetDlgItemText(0xFFFF) # 获得弹窗里的消息文字最小化窗体w=win32gui.FindWindow()win32gui.CloseWindow(w)浏览器密码控件操作# coding=utf-8import win32guiimport win32apiimport win32condef CallBack(hwnd, hwnds):if win32gui.GetClassName(hwnd) == 'Edit':hwnds[win32gui.GetClassName(hwnd)] = hwndreturn Truew1hd = win32gui.FindWindow(u'IEFrame', None)print '%x' %w1hd# w2hd = win32gui.FindWindowEx(w1hd,0,u'TabWindowClass', None) # print '%x' %w2hdhwndChildList = {}win32gui.EnumChildWindows(w1hd, CallBack, hwndChildList)for k,v in hwndChildList.items():print '%s %x' %(k,v)#win32api.SendMessage(v, win32con.WM_CHAR, ord('a'), 0) #t1 =win32gui.GetDlgItem(v,1)len1 = win32gui.SendMessage(v, win32con.WM_GETTEXTLENGTH)+1buffer = '0' *50win32gui.SendMessage(v, win32con.WM_GETTEXT, len1, buffer)print len1print buffer[:len1-1]win32gui.SendMessage(v,win32con.WM_SETTEXT,None,'902 723')。
win32界面编程 实例
win32界面编程实例
Win32界面编程是指使用Win32 API来创建Windows应用程序
的用户界面。
下面我将从不同角度给出一些Win32界面编程的实例。
1. 创建窗口,使用Win32 API可以创建一个基本的窗口应用程序。
首先需要注册窗口类,然后创建窗口并处理窗口消息。
通过设
置窗口类的属性和消息处理函数,可以实现窗口的基本功能,比如
响应用户输入、绘制图形等。
2. 控件和布局,Win32 API提供了一系列控件,比如按钮、文
本框、列表框等,可以通过创建这些控件来构建丰富的用户界面。
同时,可以使用布局管理技术来控制控件的位置和大小,以实现界
面的美观和合理布局。
3. 图形绘制,Win32 API允许开发者直接操作图形设备接口(GDI),从而实现自定义的图形绘制功能。
通过GDI可以绘制各种
图形、文本和图像,实现丰富多彩的界面效果。
4. 用户交互,Win32界面编程可以实现丰富的用户交互功能,
比如鼠标点击、键盘输入、菜单操作等。
通过响应用户的交互行为,
可以让应用程序更加灵活和易用。
5. 窗口管理,Win32 API提供了丰富的窗口管理功能,比如最大化、最小化、关闭窗口等。
开发者可以通过这些功能来管理应用程序的窗口,提升用户体验。
总之,Win32界面编程可以实现丰富多彩的Windows应用程序界面。
开发者可以通过灵活运用Win32 API提供的功能,创建出符合自己需求的界面效果。
希望以上实例可以帮助你更好地理解
Win32界面编程。
Win32 SDK窗口程序代码
Win32 SDK窗口程序代码(含详细注释)Windows SDK编程(窗口示例程序)/*****************************************************Windows SDK编程之一窗口示例程序******************************************************//*Win32应用程序框架主要由"初始化窗口类","窗口注册类","窗口的创建"以"窗口消息函数"等组成*/#include <windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明/*WinMain函数是所有windows应用程序的入口,类似于C语言中的Main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。
消息循环是整个程序运行的核心。
WinMain函数实现以下功能。
1. 注册窗口类,建立窗口及执行其它必要的初始化工作;2. 进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程3. 当消息循环检索到WM_QUIT消息时终止程序运行。
WinMain函数有三个基本的组成部份:函数说明、初始化和消息循环。
WinMain函数的说明如下:int WINAPI WinMain( //WinMain函数说明HINSTANCE hInstance, //程序当前实例句柄HINSTANCE hPrevInstance, //应用程序其它实例句柄LPSTR lpCmdLine, //指向程序命令行参数的指针int nCmdShow //应用程序开始执行时窗口显示方式的整数值标识)由于Window操作系统是多任务的操作系统,能进行多任务的管理,因此,windows应用程序可能被并行的多次执行,因而可能出现同一个程序的多个窗口同时存在的情况,Windows系统将应用程序每一次执行称为该应用程序的一个实例(Instance),并用一个实例句柄唯一的标识它。
win32内核编程_04
============第四课菜单============一、菜单的分类--------------1. 顶层菜单:窗口标题栏下方的菜单。
2. 弹出式菜单:单击右键弹出的菜单,以及下拉菜单。
3. 系统菜单:单击窗口左上角图标弹出的菜单。
二、菜单句柄和菜单标识----------------------1. 菜单对象(也是一种窗口对象)通过菜单句柄——HMENU——访问。
2. 菜单中的每个菜单项通过其唯一标识——菜单ID——访问。
三、顶层菜单------------1. 创建菜单~~~~~~~~~~~HMENU CreateMenu (void);成功返回菜单句柄,否则返回NULL。
该函数所创建的是一个空菜单,不包含任何菜单项。
2. 添加菜单项~~~~~~~~~~~~~1) 追加菜单项BOOL AppendMenu (HMENU hMenu, // 菜单句柄UINT uFlags, // 菜单项标志UINT uIDNewItem, // 菜单项IDLPCTSTR lpNewItem // 菜单项名称);成功返回TRUE,失败返回FALSE。
2) 插入菜单项BOOL InsertMenu (HMENU hMenu, // 菜单句柄UINT uPosition, // 在此菜单项(ID或位置)之前插入UINT uFlags, // 菜单项标志UINT uIDNewItem, // 菜单项IDLPCTSTR lpNewItem // 菜单项名称);第 1 页成功返回TRUE,失败返回FALSE。
3) 菜单项标志MF_STRING - 点击后发出WM_COMMAND消息,通过uIDNewItem参数的值区分具体哪个菜单项被点击了MF_POPUP - 可弹出子菜单,uIDNewItem参数取子菜单的句柄MF_SEPARATOR - 分割线,忽略uIDNewItem和lpNewItem参数MF_CHECKED - 勾选MF_UNCHECKED - 撤选MF_ENABLED - 可用MF_DISABLED - 禁用但不置灰MF_GRAYED - 禁用同时置灰MF_BITMAP - 位图MF_OWNERDRAW - 自绘MF_BYCOMMAND - uPosition参数为菜单项IDMF_BYPOSITION - uPosition参数为菜单项位置3. 将菜单安装到窗口上~~~~~~~~~~~~~~~~~~~~~BOOL SetMenu (HWND hWnd, // 窗口句柄HMENU hMenu // 菜单句柄);成功返回TRUE,失败返回FALSE。
控制台下用Win32API打开文件对话框
控制台下用Win32API打开文件对话框在控制台下打开对话框?!没错,这是完全可以的,实现起来也是相当简单,基本上连雕虫小技都不算。
不过网上这样的例子还不是很多,我就把自己写的一个demo贴上来。
参考了大名鼎鼎的《windows程序设计》中的一点代码。
[cpp]view plaincopy1.#include <Windows.h>2.#include <CommDlg.h>3.#include <iostream>4.ing namespace std;6.7.static OPENFILENAME ofn ;8.9.void PopFileInitialize (HWND hwnd)10.{11.static TCHAR szFilter[] = TEXT ("所有图片文件\0*.bmp;*.dib;*.jpg;*.jpeg;*.jpe;*.gif;*.tiff;*.png;*.ico\0") \12.TEXT ("JPEG文件 (*.jpg;*.jpeg;*.jpe)\0*.jpg;*.jpeg;*.jpe\0") \13.TEXT ("位图文件 (*.bmp;*.dib)\0*.bmp;*.dib\0") \14.TEXT ("GIF (*.gif)\0*.gif\0") \15.TEXT ("TIFF (*.tiff)\0*.tiff") \16.TEXT ("PNG (*.png)\0*.png") \17.TEXT ("ICO (*.ico)\0*.ico\0\0");18.19.ofn.lStructSize = sizeof (OPENFILENAME) ;20.ofn.hwndOwner = hwnd ;21.ofn.hInstance = NULL ;22.ofn.lpstrFilter = szFilter ;23.ofn.lpstrCustomFilter = NULL ;24.ofn.nMaxCustFilter = 0 ;25.ofn.nFilterIndex = 0 ;26.ofn.lpstrFile = NULL ; // Set in Open and Cl ose functions27.ofn.nMaxFile = MAX_PATH ;28.ofn.lpstrFileTitle = NULL ; // Set in Open and Cl ose functions29.ofn.nMaxFileTitle = MAX_PATH ;30.ofn.lpstrInitialDir = NULL ;31.ofn.lpstrTitle = NULL ;32.ofn.Flags = 0 ; // Set in Open and Close functions33.ofn.nFileOffset = 0 ;34.ofn.nFileExtension = 0 ;35.ofn.lpstrDefExt = TEXT ("jpg") ;36.ofn.lCustData = 0L ;37.ofn.lpfnHook = NULL ;38.ofn.lpT emplateName = NULL ;39.}40.41.BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileN ame, PTSTR pstrTitleName)42.{43.ofn.hwndOwner = hwnd ;44.ofn.lpstrFile = pstrFileName ;45.ofn.lpstrFileTitle = pstrTitleName ;46.ofn.Flags = OFN_HIDEREADONLY | OFN_CREAT EPROMPT ;47.48.return GetOpenFileName (&ofn) ;49.}50.51.int main()52.{53.static TCHAR szFileName[MAX_PATH], szTitleName[ MAX_PATH] ;54.HWND hwnd;55.hwnd=GetForegroundWindow(); //获取前台窗口句柄。
pythonwindows软件窗口menu操作pywin32库
pythonwindows软件窗⼝menu操作pywin32库最近接到⼀个活,要求定时点击⼀个软件的某个菜单按钮,刷新并保存⽂件按照之前的做法,就是直接控制⿏标,定位到相应位置进⾏点击不过这次,准备做的更专业化⼀点,不要那么原始主要⽤到的函数都是win32gui下⾯的,毕竟都是界⾯操作#查找窗⼝句柄win32gui.FindWindow()#查找指定窗⼝的菜单win32gui.GetMenu()#查找某个菜单的⼦菜单win32gui.GetSubMenu()#获得⼦菜单的IDwin32gui.GetMenuItemID()#获得某个⼦菜单的内容win32gui.GetMenuItemInfo()#给句柄发送通知(点击事件)win32gui.PostMessage() 1,⾸先获取到窗⼝的句柄,根据窗⼝标题即可获取2,获得窗⼝菜单的句柄3,获得某个⼦菜单的句柄4,获得⼦菜单的ID5,点击这个菜单完整代码如下import win32guiwindow_name = u'xxxx'hwnd = win32gui.FindWindow(None, window_name)menu = win32gui.GetMenu(hwnd)menu1 = win32gui.GetSubMenu(menu, 1)#第⼏个菜单cmd_ID = win32gui.GetMenuItemID(menu1, 1)#第⼏个⼦菜单win32gui.PostMessage(hwnd, win32con.WM_COMMAND, cmd_ID, 0)menu1 就是第⼏个menu,后⾯参数0就是第⼀个,file,相应的1就是editcmd_id 就是⼦菜单的id,⽐如new display... 就是0,第⼀个⼦菜单,以此类推不过实际操作下来,有些问题主要是不知道菜单的内容,有的菜单点击了不知道有没有点击成功所以需要获取⼦菜单的内容,这样就能知道点击的对不对了⾸先看下这个菜单下红⾊部分是第⼏个⼦菜单,⼀般会说6,因为总共6个选项,其实应该是9原因是3条横线也算⼦菜单这⾥找了下,发现有个函数可以提供这个标题内容win32gui.GetMenuItemInfo()经过⽹上的查找,找到了使⽤⽅法如下#获取某个菜单的内容def get_menu_item_txt(menu,idx):import win32gui_structmii, extra = win32gui_struct.EmptyMENUITEMINFO() #新建⼀个win32gui的空的结构体miiwin32gui.GetMenuItemInfo(menu, idx, True, mii) #将⼦菜单内容获取到miiftype, fstate, wid, hsubmenu, hbmpchecked, hbmpunchecked,\dwitemdata, text, hbmpitem = win32gui_struct.UnpackMENUITEMINFO(mii) #解包miireturn text ⼤概意思就是这个函数返回的是⼀个结构体,要⽤他提供的⽅法来获得这个结构体,然后在解包这个结构体就能获得标题了for i in range(5):print get_menu_item_txt(menu,i)>>>&File&Edit&Simulation&Window&Helpfor i in range(9):print get_menu_item_txt(menu1,i)>>>&Undo Ctrl+ZCu&t Ctrl+X&Copy Ctrl+C&Paste Ctrl+VC&learRefresh测试了⼏次,可以看到获取菜单时可以看到是5个,获取edit的⼦菜单时,refresh是第9个菜单,中奖有3条空⾏,对应就是3条横线这样就完成了这次的任务,不需要再⽤⿏标点击这些按钮,直接发送消息过去就等于点击按钮了,这样就没不影响操作了。
win32ui中的createfontdialog 参数
win32ui中的createfontdialog 参数`win32ui` 模块中的`CreateFontDialog` 函数用于创建一个字体选择对话框,让用户可以选择字体。
以下是`CreateFontDialog` 函数的参数:1. `hWnd`:父窗口句柄,通常是拥有字体选择对话框的窗口。
2. `lpFontData`:字体数据结构指针,包含对话框所需的所有字体信息。
可以使用`win32ui.FF_DONTCARE` 作为标志,表示不关心字体细节。
3. `nFontType`:字体类型,取值如下:- FC_DEFAULT:默认字体类型,表示使用系统默认字体。
- FC_SCREEN:屏幕字体类型,表示使用屏幕字体。
- FC_PRINTER:打印机字体类型,表示使用打印机字体。
4. `dwFlags`:附加标志,用于控制对话框的行为。
例如,可以使用`CDLG_FILESEL` 标志表示允许用户选择多个字体。
5. `lpTemplate`:可选参数,指向一个包含对话框模板的资源字符串。
如果未指定此参数,将使用默认的对话框模板。
6. `hInstance`:应用程序实例句柄,用于标识应用程序。
7. `lpszTitle`:可选参数,表示对话框的标题。
如果未指定此参数,将使用默认标题。
8. `lpszOkButtonText`:可选参数,表示“确定”按钮的文本。
如果未指定此参数,将使用默认文本。
9. `lpszCancelButtonText`:可选参数,表示“取消”按钮的文本。
如果未指定此参数,将使用默认文本。
以下是一个示例代码,展示了如何使用`win32ui` 模块创建一个字体选择对话框:```pythonimport win32ui# 创建字体选择对话框dlg = win32ui.CreateFontDialog(None, win32ui.FF_DONTCARE)# 显示对话框if dlg.DoModal() == win32ui.IDOK:# 获取选择的字体font_data = dlg.GetFontData()font_name = font_data['FaceName']font_size = font_data['Size']print("选择的字体:", font_name)print("字体大小:", font_size)else:print("用户取消了选择")```请注意,此示例代码仅展示了如何创建字体选择对话框,并获取用户选择的字体信息。
- 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):。