win32设计菜单、点击显示弹出对话框(内含可实现源代码)

合集下载

[Win32]一个调试器的实现(六)显示源代码

[Win32]一个调试器的实现(六)显示源代码

[Win32]⼀个调试器的实现(六)显⽰源代码

作者:

出处:

本⽂版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在⽂章页⾯明显位置给出原⽂连接,否则保留追究法律责任的权利。

上⼀篇⽂章介绍了调试符号以及DbgHelp的加载和清理,这回我们使⽤它来实现⼀个显⽰源代码的功能。该功能的实际使⽤效果如下图所⽰:

该功能不仅仅是显⽰源代码,还要显⽰每⼀⾏代码对应的地址。实现该功能⼤概需要进⾏以下的步骤:

①获取下⼀条要执⾏的指令的地址。

②通过调试符号获取该地址对应哪个源⽂件的哪⼀⾏。

③对于其它的⾏,通过调试符号获取它对应的地址。

第⼀步可以通过获取EIP寄存器的值来完成,相关的内容已经在第四篇⽂章中进⾏了讲解,这⾥不再重复。下⾯讲⼀下如何实现第⼆个和第三个步骤。

获取源⽂件以及⾏号

在调试符号中,记录了每⼀⾏源代码对应的地址。通过DbgHelp的SymGetLineFromAddr64函数可以由地址获取源⽂件路径以及⾏号。该函数的声明如下:

1 BOOL WINAPI SymGetLineFromAddr64(

2 HANDLE hProcess,

3 DWORD6

4 dwAddr,

4 PDWORD pdwDisplacement,

5 PIMAGEHLP_LINE64 Line

6 );

hProcess参数是符号处理器的标识符,dwAddr是指令的地址。pdwDisplacement是⼀个输出参数,⽤于获取dwAddr相对于它所在⾏的起始地址的偏移量,以字节为单位。之所以需要这么⼀个参数,是因为⼀⾏代码可能对应多条汇编指令,有了它就可以知道下⼀条要执⾏的指令位于这⼀⾏代码的哪个位置。例如,int b = 3 * a + a;这⾏代码对应以下的汇编指令:

在VB6中如何使用API来创建弹出式菜单

在VB6中如何使用API来创建弹出式菜单

在VB6中如何使用API来创建弹出式菜单要创建弹出式菜单,我们需要使用以下几个API函数:

1. GetCursorPos函数:获取鼠标当前的坐标位置。

2. CreatePopupMenu函数:创建一个弹出式菜单。

3. AppendMenu函数:向菜单添加选项。

4. TrackPopupMenu函数:显示菜单并等待用户选择。

5. DestroyMenu函数:销毁菜单。

下面是一个简单的示例,演示如何使用API函数创建弹出式菜单:

```vb

Option Explicit

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Declare Function CreatePopupMenu Lib "user32" ( As Long

Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long

Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As

在Windows下运行C语言程序

在Windows下运行C语言程序

1) 新建Win32 Console Application工程打开VC6.0,在菜单栏中选择“文件 -> 新建”,或者 Ctrl+N,弹出下面的对话框:切换到“工程”选项卡,选择“Win32 Console Application”,填写工程名称和路径,点击“确定”,会弹出一个对话框询问类型,这里选择“一个空工程”,如下图所示:点击“确定”完成创建。“Win32 Console Application”是控制台应用程序,这样的程序类似 doc 或 cmd,没有漂亮的界面,可以显示字符。2) 新建C源文件在菜单栏中选择“文件 -> 新建”,或者 Ctrl+N,弹出下面的对话框:切换到“文件”选项卡,选择“C++ Source File”,填写文件名,点击确定完成。该步骤是向刚才创建的工程添加源文件;C语言源文件一般以 .c 为后缀。3) 编写C语言代码在工作空间中可以看到刚才创建的工程和源文件,入下图所示:双击 hello.c,进入编辑界面,输入例1-1中的代码。4) 编译并运行代码C语言源代码,必要要经过编译、组建(也被称为“链接”)和运行才能看到输出结果:编译将C语言代码“翻译”成机器码(这里暂时可以理解成0和1序列)。组建将工程所需的所有资源集合到一起,最终生成 .exe文件。运行就是执行 .exe 程序,和运行其他程序一样,双击即可。编译、组建、运行的功能可以在“组建”中找到,如下图所示:更加简单的方法是使用快捷方式,如下图所示:对于初学者,最常用的是运行按钮,编写完代码,一次点击就可以看到输出结果。当然,你也可以使用快捷键:Ctrl+F7(编译)、F7(组建)、Ctrl+F5(运行)。刚才我们已经编写了源代码,保存后,点击运行按钮或 Ctrl+F5,如果程序正确,可以看到运行结果,如下图所示:恭喜你,你已经完成了第一个C语言程序,越过了第一道障碍。注意:编译生成的 .exe 文件在工程目录下的Debug文件夹内。以上面的工程为例,路径为 E:\cDemo,打开看到有一个Debug文件夹,进入可以看到 cDemo.exe。如果你在安装或使用过程中遇到错误,请查看VC6.0使用教程,已经解决了一些常见的问题。在C-Free中运行C语言程序更加简单,无需创建工程,可以单独运行一个C源文件,这里不再赘述,方法与VC6.0类似。两个练习请大家再运行下面两个程序,体会一下C语言的结构。这两个例子大家无需理解,能够运行出正确的结果就成功了。【例1-2】输出1+2+3+...+99+100的值。#include // 包含stdio.h头文件int main(){int i, total=0; // 声明两个整型变量/* for语句用来循环i的起始值为 1,每循环一次加 1,i>100 时退出循环 */for(i=1; i<=100; i++){to

WIN32 API之菜单

WIN32  API之菜单
参考源程序:
#include <windows.h>
#include <resource.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
6.重新运行,得到的结果如图所示。
wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);//菜单名
《WIN32 API之菜单》
本文主要使用的工具为VC6.0英语版,如有使用中文版的童鞋们请自行翻译哟,考验大家英语水平的时候到了。
1.新建一个Win32 Application项目,项目名填:Menu,点击“OK”后选择“An empty project”,点击完成。
2.新建一个源程序。当然要保存到上面新建的项目内,相信读者的基础已经非常好了,作者就不废话了。
wndclass.lpszClassName= szAppName ;

为对话框增加菜单

为对话框增加菜单

为对话框增加菜单

1.为对话框创建一个菜单资源IDR_MENU1。

2. 在对话框的属性对话框中在Menu属性中选择刚创建的菜单资源IDR_MENU1。此时保存编译后,在对话框中就可看到菜单。

3.点击快捷键Ctrl + W,在“Add a Class”对话框中选择已存在的对话框类“Select an existing class”,打开“Select Class”对话框。

4. 选择对话框类,本例中的类名为CDlgDlg,选中进入下一步。

5. 进入MFC ClassWizard对话框,在消息映射属性页中,为菜单增加消息处理函数,本例中为“打开文件”菜单增加COMMAND处理函数,增加的函数名为

OnFileOpen。

6.编辑OnFileOpen函数代码,实现自己定义的功能,本例只是简单显示“关于”对话框。

void CDlgDlg::OnFileOpen()

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

编译运行后,点击文件菜单的子菜单“打开文件”,将弹出“关于”对话框,如

下图所示。

接下来为对话框添加右键菜单。

1.为对话框增加事件

2.在打开的对话框中,在左侧的消息/事件列表中选择WM_CONTEXTMENU,添加OnContextMenu函数。

3. 编辑代码如下。

void CDlgDlg::OnContextMenu(CWnd* pWnd, CPoint point)

{

CMenu MyMenu;

MyMenu.LoadMenu(IDR_MENU1);

CMenu* pMyMenu=MyMenu.GetSubMenu(0);

win32gui用法

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()`函数。该函数需要传入窗口的类名、窗口的样式、窗口的父窗口等参数。创建窗口后,可以通过调用其他函数来设置窗口的位置、大小、标题等信息。

示例代码:

```python

import win32gui

window_class = "MyWindowClass"

window_style = win32con.WS_OVERLAPPEDWINDOW |

win32con.WS_VISIBLE

window_rect = (0, 0, 640, 480)

window_proc = win32gui.WNDPROC()

创建弹出菜单(共9张PPT)

创建弹出菜单(共9张PPT)
色、阴影和高亮等进 行设置。
第七页,共9页。
控制弹出菜单和子菜单的位置
▪ 在Fireworks 8中,可以 通过【弹出菜单编辑 器】对话框中的【位 置】选项卡,指定弹 出菜单的位置,还可 以对子菜单的位置进 行有效的控制,当网 页层可见时,还可以 通过在工作区中拖动 顶级弹出菜单的轮廓 来调整其位置。
创建基本弹出菜单
▪ 创建简单的弹出菜单,则首先选择一个热点 或切片,把它们作为弹出菜单的触发器,然 后单击【修改】菜单中的【弹出菜单】子菜 单下的【添加弹出菜单】命令,弹出【弹出 菜单编辑器】对话框。
▪ 在这个对话框的【内容】选项卡上单击【添 加菜单】按钮,添加一个空菜单项,双击每 个单元格并输入或选择适当的信息。
第六页,共9页。
设置高级弹出菜单属性
向弹出菜单编辑器中添加自定义单元格样式,首先要把笔触、填充、纹理和动态滤镜的任意组合应用于对象,然后用样式面板把这个组合 保存为样式,接着在样式面板中选择这个新样式,单击样式面板右上角的按钮,在弹出的菜单中,单击【导出样式】按钮,把新样式导出 到硬盘上的Menu Bars文件夹内。
单击文本样式按钮,设置粗体或斜体样式,单击对齐按钮,使文本左对齐、居中或右对齐,可以在【文本颜色】选项中,对文本的颜色进
置,可以对单元格大 行选择。
控制弹出菜单特征的选项被组织在四个选项卡中: 单击文本样式按钮,设置粗体或斜体样式,单击对齐按钮,使文本左对齐、居中或右对齐,可以在【文本颜色】选项中,对文本的颜色进

Win32教程9-子窗口控件

Win32教程9-子窗口控件

Win32教程9-子窗口控件| 首页 >> 编程详解 >> Iczelion的Win32汇编教程 | Win32ASM 论坛 | 联系站长 |Win32教程9-子窗口控件作者:Lxx翻译·发布日期:2000-7-1·阅读次数:3157【在这里下载本文的源代码】本课中我们将探讨控件,这些控件是我们程序主要的输入输出设备。理论:WINDOWS 提供了几个预定义的窗口类以方便我们的使用。大多数时间内,我们把它们用在对话框中,所以我们一般就它们叫做子窗口控件。子窗口控件会自己处理消息,并在自己状态发生改变时通知父窗口。这样就大大地减轻了我们的编程工作,所以我们应尽可能地利用它们。本课中我们把这些控件放在窗口中以简化程序,但是大多数时间内子窗口控件都是放在对话框中的。我们示例中演示的子窗口控件包括:按钮、下拉菜单、检查框、单选按钮、编辑框等。使用子窗口控件时,先调用CreateWindow 或 CreateWindowEx。在这里由于WINDOWS 已经注册了这些子控件,所以无须我们再注册。当然我们不能改变它们的类名称。譬如:如果您想产生一个按钮,在调用上述两个函数时就必须指定类名为"button"。其他必须指定的参数还有父窗口的句柄和将要产生的子控件的ID号。子控件的ID号是用来标识子控件的,故也必须是唯一 的。子控件产生后,当其状态改变时将会向父窗口发送消息。一般我们应在父窗口的WM_CREATE消息中产生字控件。子控件向父窗口发送的消息是WM_COMMAND,并在传递的参数wPara的底位中包括控件的ID号,消息号在wParam的高位,lParam中则包括了子控件的窗口的句柄。各类控件有不同的消息代码集,详情请参见WIN32 API参考手册。父窗口也可以通过调用函数SendMessage向子控件发送消息,其中第一个参数是子控件的窗口句柄,第二个参数是要发送的消息号,附加的参数可以在wParam和lParam中传递,其实只要知道了某个窗口的句柄就可以用该函数向其发送相关消息。所以产生了子窗口后必须处理WM_COMMAND消息以便可以接收到子控件的消息。例子:我们将产生一个窗口,在该窗口中有一个编辑框和一个按钮。当您按下按钮时 ,会弹出一个对话框其中显示了您在编辑框中输入的内容。另外,该应用程序还有一个菜单,其中有四个菜单项:Say Hello -- 把一个字符串输入编辑控件;Clear Edit Box -- 清除编辑控件中的字符串;Get Text -- 弹出对话框显示编辑控件中的字符串;Exit -- 退出应用程序。.386.model flat,stdcalloption casemap:noneWinMain proto :DWORD,:DWORD,:DWORD,:DWORDinclude \masm32\include\windows.incinclude \masm32\include\user32.incinclude \masm32\include\kernel32.incincludelib \masm32\lib\

win32界面编程 实例

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界面编程。

创建显示对话框的DLL

创建显示对话框的DLL

创建显示对话框的DLL

现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题。

一.Win32 DLL

在Win32 DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件。然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义你自己的对话框回调函数处理对话框收到的消息。

1)在VC菜单中File->New新建一个命名为UseDlg的Win32 Dynamic-Link Library工程,下一步选择A simple DLL project。

2)在VC菜单中Insert->Resource添加一个ID为IDD_DLG_SHOW的Dialog资源,将此Dialog上的Cancel按钮去掉,仅保留OK按钮。再添加一个ID为IDD_ABOUTBOX的对话框,其Caption为About。保存此资源,将资源文件命名为UseDlg.rc。并将resource.h和UseDlg.rc加入到工程里面。

3)在UseDlg.app中包含resource.h,并添加如下代码:

HINSTANCE hinst = NULL;

HWND hwndDLG = NULL;

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

win32程序创建按钮并响应点击

win32程序创建按钮并响应点击

win32程序创建按钮并响应点击

我们可以把控件当成特殊的一类窗口,所以,创建控件与创建窗口一样,使用CreateWindow或CreateWindowEx函数,不过,在窗口样式上面记得用上以下两位帅哥:

a、WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口,WS_CHILDWINDOW也一样,为了节约几个字母,用WS_CHILD吧。

b、WS_VISIBLE:既然要使用控件,自然要让别人看得见。

到底在啥时候创建控件合适一点呢?一种方法是在WinMain方法中创建,注意要把CreateWindow函数的hWndParent参数设置为窗口的句柄。

这里用第二种方法,我们知道,在窗口创建后,显示之前,即CreateWindow函数返回之前,我们会收到WM_CREATE消息,我们响应它的号召,艰苦奋斗创建一个按钮。

1.//窗口处理函数

2.LRESULT CALLBACK WinProc(

3.HWND hwnd, //当前句柄

4.UINT msg, //当前MSG消息

5.WPARAM wParam,

6.LPARAM lParam)

7.{

8.switch (msg)

9.{

10.case WM_CREATE:

11.//创建窗口时调用,我们也可以在这里面创建按钮

12.break;

13.

14.case WM_CLOSE: //点击关闭按钮

15.DestroyWindow(hwnd);

16.break;

17.

18.case WM_DESTROY:

19.PostQuitMessage(0);

python中弹出消息框--MessageBox(pywin32)

python中弹出消息框--MessageBox(pywin32)

python中弹出消息框--MessageBox(pywin32)代码:

import win32api,win32con

win32api.MessageBox(0, "这是⼀个测试消息", "消息框标题",win32con.MB_OK)

需要安装pywin32模块,

pip install pywin32

有了这个模块python就可以使⽤windows api了,

例⼦:

import win32gui,win32con

wdname1=u"焦点资讯"

hwnd=win32gui.FindWindow(0,wdname1)

print(hwnd)

win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)

补充:还可⽤pyautogui弹出消息框

罗云彬的Win32汇编教程

罗云彬的Win32汇编教程

罗云彬的Win32汇编教程之一

Win32汇编的环境和基础

1.32位环境简介

在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。

在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M 的内存,寻址时通过段寄存器来制定段的初始地址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。

而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在最高级--0级中,所有应用程序都工作在3级中(Ring3),在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说,系统才是全开放的。

Iczelion的Win32汇编教程008

Iczelion的Win32汇编教程008

第八课 菜单--------------------------------------------------------------------------------本课中我们将在我们的应用程序中加入一个菜单。 理论:菜单可以说是WINDOWS最重要的元素之一。有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且可以立即操作,无须去阅读手册了.正因为菜单给了用户一种方便的方式,所以您在应用程序中加入菜单时就要遵守一般的标准.譬如:一般头两个菜单项是"File"和"Edit",最后是"Help",您可以在这中间插入您要定义的菜单项.如果所运行的菜单命令会弹出一个对话框,那么就要在该菜单项后加入省略符(...).菜单是一种资源,除菜单外还有其它像对话框,字符串,图标,位图资源等.在链接时链接程序将把资源加入到可执行程序中去,最后我们的执行程序中就既包括机器指令又包括了资源. 您可以在任何文本编辑器中编写脚本文件,在文件中您可以指定资源呈现出来的外观和其它的一些属性.当然更直观的方法是用资源编辑器,通常资源编辑器都打包在编译环境中,像Visual C++, Borland C++等都带了资源编辑器. 我们可以按以下方式来定义一个菜单资源: MyMenu MENU { [menu list here] } 这和C语言中的结构体的定义非常相似。 MyMenu类似于被定义的变量,而MENU则类似于关键字。当然您可以用另外一种办法,那就是用BEGIN和END来代替花括号,这和PASCAL语言中的风格相同。 在菜单项的列表中是一大串的MENUITEM和POPUP语句。MENUITEM定义了一个菜单项,当选择后不会激活对话框。它的语法如下: MENUITEM "&text", ID [,options] 它由关键字MENUITEM开头,紧跟在MENUITEM后的是指菜单项的名称字符串,符号“&“后的第一个字符将会带下画线,它也是该菜单项的快捷键。ID的作用当该菜单被选中时,WINDOWS的消息处理过程用来区分菜单项用的。毫无疑问,ID号必须唯一。options有以下可供选择的属性: GRAYED 代表该菜单项处于非激活状态,即当其被选中时不会产生WM_COMMAND消息。该菜单以灰色显示。 INACTIVE 代表该菜单项处于非激活状态,即当其被选中时不会产生WM_COMMAND消息。该菜单以正常颜色显示。 MENUBREAK 该菜单项和随后的菜单项会显示在新列中。(译者注:比较难描述,请做实验。) HELP 该菜单项和随后的菜单项右对齐。(译者注:我在WINDOWS2000下编译有该标志的菜单项,该标志好像没起作用) 您可以单独使用以上标志位,也可以把它们或在一起。当然INACTIVE和GRAYED不能同时使用。 POPUP的语法如下: POPUP "&text" [,options] { [menu list] }POPUP定义了一个菜单项当该菜单项被选中时又会弹

如何显示Windows标准运行对话框

如何显示Windows标准运行对话框

探索如何显示Windows标准“运行”对话框

作者:SmartTech

我们有时在编写一些实用工具时可能想要显示一个类似与Windows中的标准“运行”对话框。虽然我们可以自己手工实现这个对话框,但是标准的“运行“对话框中却可以列出你曾经键入的命令。并且,最后一次输入的命令,如果它能够正常运行,那么它总是出现在组合框的最上端。在Windows中很多数据都是保存在系统注册表中的,我们当然有理由认为像这样的数据就被保存在注册表中。通过键入一些可用命令并在注册表中搜索,我们可以找到这个存储位置为HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU这个子键(SubKey)。这个子键中的每个值(Value)中的数据(Data)就是你曾经键入的命令。其中有个值MRUList保存的是你键入的命令的顺序。不过它保存的是键入的相反顺序,也就是说,最后一次键入并成功运行的命令总是出现在这个值的数据中的第一个位置。当然,我们可以枚举RunMRU这个子键然后将曾经运行过的各个命令添加到自己手工实现的运行对话框中的组合框中,并分析MRUList这个值中的数据来对枚举出的各个命令字符串进行排序。这样就能完全模仿系统的“运行”对话框。这不失为一种方法。但是,一定有许多人像我一样,确实想知道到底系统是如何显示这个对话框的。那就让我们一步一步来分析吧!

在调用这个对话框的系统程序中,我们首先想到就是系统Shell(即explorer.exe)。本想拿它来做实验,但是它太大,也太复杂,并不合适。接下来能想到的程序可能就是任务管理器了(即taskmgr.exe)。当你启动任务管理器后,单击“文件”菜单,就会看到“新建任务”命令,单击它就会出现“运行“对话框。另外一个会显示“运行”对话框的程序就是下面要提到的Process Explorer,并且它的“运行”对话框有标准的,也有定制的。那任务管理器是如何显示这个对话框的呢?这里,我要提到一个工具,那就是Process Explorer,它是由著名的Windows NT黑客Mark E. Russinovich编写的。现在Mark已经进入Microsoft,成为核心开发成员之一。它的网站(现在已经合并到Microsoft网站中)中免费公开许多实用工具(甚至它们的源代码),像著名的FileMon和RegMon等等。在他与David A. Solomon合著的《Inside Windows 2000, Third Edition》中,Solomon曾经提到Mark不看Windows源代码,仅用ntoskrnl.exe(Windows 执行内核)的反汇编代码并配合SoftICE就能很快解决遇到的问题。就连Windows NT之父David N. Cutler也佩服他竟然能在正在运行的Windows上运行内核调试器(Microsoft虽然支持内核调试,但是一定要在启动选项加入/DEBUG并重新启动之后才能有效地使用内核调试器),以及能让Windows 9x支持NTFS分区。这些都是十分棘手的问题。否则,Microsoft没有必要不自己实现。Mark的水平由此可见一斑。Process Explorer本来就是被设计用来替代任务管理器的,它实现了任务管理器的一切功能,并且又加入了许多有用的功能。今天我们要用到的就是其中的一个功能。

Win32 Api编程指南

Win32 Api编程指南
WinMain( )函数等价于 DOS 或者 UNIX 编程中的 main( )函数。这是我们程序执行的入口点。参数的含义 如下:
HINSTANCE hInstance 程序执行模块的句柄。( 内存中的.exe 文件 )。
HINSTANCE hPrevInstance 在 Win32 程序中总为 NULL。
switch( msg ) {
case WM_CLOSE: DestroyWindow( hwnd );
break; case WM_DESTROY:
PostQuitMessage( 0 ); break; default:
return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
窗口类和 C++中的类没有任何关系。
const char g_szClassName[] = "myWindowClass";
上面的数组中存储着我们要创建的窗口类的名字,我们将用它向系统注册我们的窗口类。
WNDCLASSEX wc;
wc.cbSize
= sizeof( WNDCLASSEX );
wc.style
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档