win32 封装的小函数工具

0x00 封装MyPrintf()

win32程序中命令行窗口调试程序非常方便,所以我将命令行窗口的代码封装成了一个MyPrintf()函数。

template <typename T>
void MyPrintf(char* str,T data){
	AllocConsole();
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	//HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
	//HANDLE hError = GetStdHandle(STD_ERROR_HANDLE);
	char buff[1024]={0};
	sprintf(buff,str,data);
	WriteConsole(hOutput,buff,strlen(buff),NULL,NULL);
	return;
}

上一个版本太垃圾啦,这是改进版:

一份源程序,既可以编译成多字节字符集,也可以编译成宽字节字符集。

#include <cstdio>
void MyPrintf(TCHAR* format,...) {
	AllocConsole();
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	TCHAR buff[1024] = { 0 };
	va_list pArgs;
	va_start(pArgs, format);
	_vsntprintf(buff,sizeof(buff)/sizeof(TCHAR),format,pArgs);
	va_end(pArgs);
	WriteConsole(hOutput, buff, lstrlen(buff), NULL, NULL);
	return;
}

0x01 输出附加消息lParam的函数:

利用该函数可以测试各种消息的lParam表示什么含义

void PrintlParam(LPARAM lParam){
	POINT pos;
	pos.x = LOWORD(lParam);
	pos.y = HIWORD(lParam);
	MyPrintf("HIWORD(lParam):%d ",pos.x);
	MyPrintf("LOWORD(lParam):%d\n",pos.y);
	return;
}

0x02 输出附加消息wParam的函数:

利用该函数可以测试各种消息的wParam表示什么含义

void PrintwParam(WPARAM wParam){
	MyPrintf("HIWORD(wParam):%d ",HIWORD(wParam));
	MyPrintf("LOWORD(wParam):%d\n",LOWORD(wParam));
	return;
}

0x04 添加顶层菜单

/*第一个参数n 表示子菜单的个数,第二个参数m表示每个子菜单有多少个孙子菜单*/
void ReadyTopMenu(HWND hwnd,int n,int m){
	HMENU hTopMenu = CreateMenu();
	HMENU* phChild = (HMENU*)malloc(sizeof(HMENU)*n);
	memset(phChild,0,sizeof(HMENU)*n);
	string childName[10]={"子菜单1","子菜单2","子菜单3","子菜单4"};
	string grandChildName[10][10]={
		{"孙子菜单01","孙子菜单02","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单1","孙子菜单2","孙子菜单3","孙子菜单4","孙子菜单5"},
		{"孙子菜单81","孙子菜单82","孙子菜单83","孙子菜单84","孙子菜单85"},
		{"孙子菜单91","孙子菜单92","孙子菜单93","孙子菜单94","孙子菜单95"}
	};
	int grandChildId[10][10] = {0};
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			grandChildId[i][j]=i*10 + j;
		}
	}
	for(int i=0;i<n;i++){
		phChild[i] = CreatePopupMenu();
		AppendMenu(hTopMenu,MF_POPUP,(UINT_PTR)phChild[i],childName[i].c_str()); 
		for(int j=0;j<m;j++){
			AppendMenu(phChild[i],MF_STRING,grandChildId[i][j],grandChildName[i][j].c_str());
		}
			
	}
	SetMenu(hwnd,hTopMenu);
}

0x03 各种消息的wParam含义汇总:

01、WM_PAINT消息

LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高

 

02、滚动条WM_VSCROLL或WM_HSCROLL消息

LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。

 

03、击键消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN

wParam是虚拟键代码,lParam是包含属于击键的其他信息。lParam消息参数分为6个域,有重复计数、环境代码、键的先前状态等。

 

04、字符消息WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR

wParam参数是ASCII或Unicode字符代码,lParam是包含属于击键的其他信息。lParam消息参数分为6个域,有重复计数、环境代码、键的先前状态等。

 

05、客户区鼠标消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONUP

lParam参数的低位是鼠标的客户区x坐标,高位是客户区y坐标。wParam参数是指示鼠标键及Shift和Ctrl键的状态。

wParam & MK_SHIFT或MK_CTRL 按位与操作,如果返回TRUE就意味着有按下Shift或Ctrl键。

#define MK_LBUTTON	1
#define MK_RBUTTON	2
#define MK_SHIFT	4
#define MK_CONTROL	8

06、非客户区消息

wParam参数指明移动或者单击鼠标键的非客户区位置,以HT开头,lParam参数低位指出了鼠标所在屏幕坐标的x坐标,高位指出了鼠标所在屏幕坐标的y坐标。

 

07、鼠标轮滚动消息,WM_MOUSEWHEEL消息

lParam将获得鼠标的屏幕位置(坐标),仍然HIWORD表示y,LOWORD表示x

wParam参数的低位表明鼠标键和Shift与Ctrl键的状态。wParam高位有一个“delta”值,该值可正可负,指出了滚轮导致屏幕滚动几行,120表示向上3行。

 

08、计时器消息WM_TIMER

wParam参数等于计时器的ID值,lParam为0

 

09、按钮子窗口的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。

 

10、焦点消息,对于正在失去焦点的窗口,会收到WM_KILLFOCUS消息

wParam参数是即将接收输入焦点的窗口的句柄。对于即将获取焦点的窗口,会收到WM_SETFOCUS消息,其wParam参数是正在失去焦点的窗口的句柄。

 

11、编辑控制的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。

 

12、列表框的WM_COMMAND消息

wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。

 

13、菜单消息1,WM_INITMENU

wParam是主菜单句柄,lParam是0.

 

14、菜单消息2,WM_MENUSELECT,菜单跟踪消息,指针移到菜单的某一些,就会发送这个消息给窗口过程

wParam参数的低位是选中项菜单的ID或者弹出式菜单的句柄,高位是选择标识,lParam参数是包含选中项的菜单句柄。
 

输出鼠标右键消息的附加消息

void testRightButton(LPARAM lParam,WPARAM wParam){
	/*功能描述:输出鼠标右键点击消息的两种附加消息的值*/
	MyPrintf("%s\n","*****鼠标右键点击测试*****"); 
	PrintlParam(lParam);
	PrintwParam(wParam);
	MyPrintf("%s\n","**************************");
}

输出鼠标做左键消息的附加消息

void testLeftButton(LPARAM lParam,WPARAM wParam){
	/*功能描述:输出鼠标左键点击消息的两种附加消息的值*/
	MyPrintf("%s\n","*****鼠标左键点击测试*****"); 
	PrintlParam(lParam);
	PrintwParam(wParam);
	MyPrintf("%s\n","**************************");
}

0x04 测试按键的键值函数:

void PrintKeyValue(WPARAM wParam){
	MyPrintf("键值为:%d\n",wParam); 
	MyPrintf("键为:%c\n",wParam);
}

/*
for a instance:
case WM_KEYDOWN:
    PrintKeyValue(wParam);
*/

0x05插入音乐

#include<windows.h>
#include<Mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;/*不要忘了写这句话*/

case WM_CREATE:
		PlaySound(TEXT("C://kong.wav"), NULL, SND_FILENAME | SND_ASYNC);
		break;

0x06 CreateProcessAsAdmin()

HANDLE CreateProcessAsAdmin(PTCHAR fileName) {
	SHELLEXECUTEINFO sei = {0};
	sei.cbSize = sizeof(SHELLEXECUTEINFO);
	sei.lpVerb = TEXT("runas");
	sei.lpFile = fileName;
	sei.nShow = SW_SHOWNORMAL;
	sei.fMask = SEE_MASK_NOCLOSEPROCESS;

	if (!ShellExecuteEx(&sei)) {
		DWORD dwError = GetLastError();
		if (dwError == ERROR_CANCELLED) {
			cout << "提权失败!" << endl;
		}
		else if (dwError == ERROR_FILE_NOT_FOUND) {
			cout << "未找到文件" << endl;
		}
		//return NULL;//可有可无
	}
	return sei.hProcess;
}

0x07 CreateProccessAsStdUser()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C++代码封装win32操作类, 与MFC相似,对于学习SDK与C++是巨好的参考 Tutorials Menu of tutorials Tutorial 1: The Simplest Window Tutorial 2: Using Classes and Inheritance Tutorial 3: Using Messages to Create a Scribble Window Tutorial 4: Repainting the Window Tutorial 5: Wrapping a Frame around our Scribble Window Tutorial 6: Customising Window Creation Tutorial 7: Customising the Toolbar Tutorial 8: Loading and Saving Files Tutorial 9: Printing Tutorial 10: Finishing Touches Tutorial 1: The Simplest Window The following code uses Win32++ to create a window. This is all the code you need (in combination with Win32++) to create and display a simple window. Note that in order to add the Win32++ code to our program, we use an #include statement as shown below. #include "../Win32++/Wincore.h" INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { //Start Win32++ CWinApp MyApp; //Create a CWnd object CWnd MyWindow; //Create (and display) the window MyWindow.Create(); //Run the application return MyApp.Run(); } This program has four key steps: Start Win32++. We do this here by creating a CWinApp object called MyApp. Create a CWnd object called MyWindow. Create a default window by calling the Create function. Start the message loop, by calling the Run function. If you compile and run this program, you'll find that the application doesn't end when the window is closed. This is behaviour is normal. An illustration of how to use messages to control the windows behaviour (including closing the application) will be left until tutorial 3.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值