捕捉Win32窗口操作

// CreateProcessSuspend.cpp : 定义控制台应用程序的入口点。
//
//在桌面打开记事本,然后通过spy++来查看窗口的类和标题,或者句柄(不推荐直接使用句柄,因为会程序关闭后会改变)
#include "stdafx.h"
#include <windows.h>
#pragma  comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//隐藏控制台,方便查看效果

/*修改窗口标题*/
void ModifyWindowText() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd!=NULL)
	{
		::SetWindowText(hWnd,TEXT("我的记事本"));
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"),0);
	}
}
/*窗口控制*/
void DialogConsole() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd != NULL)
	{
		/*typedef void (WINAPI *PSWITCHTOTHISWINDOW)(HWND, BOOL);
		PSWITCHTOTHISWINDOW SwitchToThisWindow;
		HMODULE hUser32 = LoadLibrary("user32.dll");
		SwitchToThisWindow = (PSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");*/
		//切换窗口
		SwitchToThisWindow(hWnd,true);
		Sleep(3000);
		::SendMessage(hWnd, WM_CLOSE, 0, 0);
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
/*查找子窗口*/
void FindSubWnd() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd != NULL)
	{
		//查找子窗口//使用的扩展是FindWindow
		HWND hSubWnd = ::FindWindowEx(hWnd, NULL,TEXT("Edit"), TEXT(""));
		//HWND hSubWnd = GetDlgItem(hWnd, 0xF);
		::SendMessage(hSubWnd, WM_SETTEXT, 0, (LPARAM)TEXT("新的内容"));
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
/*枚举子窗口函数*/
BOOL CALLBACK EnumSubProc(HWND hwnd,LPARAM lpParam) {
	TCHAR szTitle[MAX_PATH] = { 0 };
	::GetWindowText(hwnd, TEXT(szTitle), MAX_PATH);
	MessageBox(NULL, szTitle, TEXT("hello"), 0);
	return true;
}
/*枚举子窗口*/
void EnumSubWnd() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd != NULL)
	{
		::EnumChildWindows(hWnd,EnumSubProc,0);
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
/*枚举子窗口函数*/
BOOL CALLBACK EnumOpenProc(HWND hwnd, LPARAM lpParam) {
	TCHAR szTitle[MAX_PATH] = { 0 };
	::GetWindowText(hwnd, TEXT(szTitle), MAX_PATH);
	MessageBox(NULL, szTitle, TEXT("hello"), 0);
	if (strcmp(szTitle,TEXT("无标题 - 记事本"))==0)
	{
		MessageBox(NULL, szTitle, TEXT("找到了"), 0);
		return false;
	}
	return true;
}
/*枚举子窗口*/
void EnumOpenWnd() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd != NULL)
	{
		::EnumWindows(EnumOpenProc,NULL);
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
void SimulateKeyEvent() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	RECT r;
	HWND hWnd = ::FindWindow(TEXT("CalcFrame"), TEXT("计算器"));
	if (hWnd != NULL)
	{
		
		::GetWindowRect(hWnd, &r);

		printf("%d %d", r.left, r.top);

		//设置鼠标位置
		::SetCursorPos(r.left+330, r.top+330);
		Sleep(2000);
		SwitchToThisWindow(hWnd, true);
		//鼠标左键单击
		mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//点下左键
		mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松开左键
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
/*模拟键盘输入*/
void SimulateKeyBoardInput() {
	TCHAR szTitle[MAX_PATH] = { 0 };
	RECT r;
	HWND hWnd = ::FindWindow(TEXT("Notepad"), TEXT("无标题 - 记事本"));
	if (hWnd != NULL)
	{
		HWND hSubWnd = GetDlgItem(hWnd, 0xF);
		::GetWindowRect(hSubWnd, &r);
		SwitchToThisWindow(hWnd, true);
		::SetCursorPos(r.left+100, r.top+100);
		mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
		mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

		//模拟键盘输入
		keybd_event(97, 0, 0, 0);
		keybd_event(97, 0, KEYEVENTF_KEYUP, 0);
		Sleep(1000);
		keybd_event(97, 0, 0, 0);
		keybd_event(97, 0, KEYEVENTF_KEYUP, 0);
		Sleep(1000);
		keybd_event(97, 0, 0, 0);
		keybd_event(97, 0, KEYEVENTF_KEYUP, 0);
		Sleep(1000);
		keybd_event(97, 0, 0, 0);
		keybd_event(97, 0, KEYEVENTF_KEYUP, 0);
		Sleep(1000);
	}
	else {
		MessageBox(NULL, TEXT("找不到窗口"), TEXT("提示"), 0);
	}
}
int main()
{
	//ModifyWindowText();
	//DialogConsole();
	//FindSubWnd();
	//EnumSubWnd();
	//EnumOpenWnd();
	//SimulateKeyEvent();
	SimulateKeyBoardInput();
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现拖动窗口到屏幕边缘自动最大化,可以在窗口的消息处理函数中捕捉 WM_WINDOWPOSCHANGING 消息,然后判断窗口是否位于屏幕边缘,如果是,则将窗口状态设置为最大化。以下是具体的实现步骤: 1. 在窗口类的消息处理函数中添加对 WM_WINDOWPOSCHANGING 消息的处理。 ```cpp LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_WINDOWPOSCHANGING: OnWindowPosChanging((WINDOWPOS*)lParam); break; // 其他消息处理 } } ``` 2. 实现 OnWindowPosChanging 函数,判断窗口位置是否位于屏幕边缘,并设置窗口状态。 ```cpp void OnWindowPosChanging(WINDOWPOS* pWndPos) { if (pWndPos->flags & SWP_NOMOVE) return; // 获取屏幕工作区矩形(不包括任务栏) RECT rcWorkArea; SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0); // 判断窗口是否位于屏幕边缘 if (pWndPos->x <= rcWorkArea.left) { pWndPos->x = rcWorkArea.left; pWndPos->cx = rcWorkArea.right - rcWorkArea.left; } else if (pWndPos->x + pWndPos->cx >= rcWorkArea.right) { pWndPos->x = rcWorkArea.right - pWndPos->cx; } if (pWndPos->y <= rcWorkArea.top) { pWndPos->y = rcWorkArea.top; pWndPos->cy = rcWorkArea.bottom - rcWorkArea.top; } else if (pWndPos->y + pWndPos->cy >= rcWorkArea.bottom) { pWndPos->y = rcWorkArea.bottom - pWndPos->cy; } } ``` 在 OnWindowPosChanging 函数中,首先判断了窗口是否被移动,如果没有移动则直接返回。接着使用 SystemParametersInfo 函数获取屏幕的工作区矩形,然后判断窗口是否位于屏幕边缘,如果是,则将窗口状态设置为最大化或调整窗口大小使其占据整个屏幕工作区。 注意:使用 SystemParametersInfo 函数需要包含 windows.h 头文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至尊小毛毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值