C语言打开记事本文件,并向记事本写入字符串,跨程序向cmd命令行窗口写入字符串执行命令

终于解决了C语言控制cmd窗口,多次发送字符串给cmd执行命令,特此记录一下。
功能1:C语言用线程打开记事本,发送消息给记事本,实现向记事本写入字符
功能2:C语言发送消息给已经打开的cmd窗口,实现自动化执行cmd命令,这里是可以持续不断的发送命令,而不是普通的带参数打开cmd,比如一个命令开始,还可以再传递一个结束的命令,等等。

在VS2015里新建空白cpp工程,设置字符集为多字节,关闭SDL安全检查,新建一个cpp源文件

代码如下:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
	TCHAR szCommandLine[] = TEXT("Notepad");//或者WCHAR
											//LPWSTR szCommandLine = TEXT("NOTEPAD");//错误
											//STARTUPINFO si = { sizeof(si) };
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	si.dwFlags = STARTF_USESHOWWINDOW;  // 指定wShowWindow成员有效
	si.wShowWindow = TRUE;          // 此成员设为TRUE的话则显示新建进程的主窗口,
									// 为FALSE的话则不显示

	BOOL bRet = ::CreateProcess(
		NULL,           // 不在此指定可执行文件的文件名
		szCommandLine,      // 命令行参数
		NULL,           // 默认进程安全性
		NULL,           // 默认线程安全性
		FALSE,          // 指定当前进程内的句柄不可以被子进程继承
		CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口
		NULL,           // 使用本进程的环境变量
		NULL,           // 使用本进程的驱动器和目录
		&si,
		&pi);

	if (bRet)
	{
		//WaitForSingleObject(pi.hProcess, INFINITE);
		// 既然我们不使用两个句柄,最好是立刻将它们关闭
		::CloseHandle(pi.hThread);
		::CloseHandle(pi.hProcess);
		
		printf(" 新进程的进程ID号:%d \n", pi.dwProcessId);
		printf(" 新进程的主线程ID号:%d \n", pi.dwThreadId);
		//TerminateProcess(pi.hProcess, 0);
		

		Sleep(5000);
		//此行是获取已经打开的cmd窗口,并给它发送字符串

		HWND hcmdwindow = FindWindow("ConsoleWindowClass", "命令提示符");
		char *cmdstr = "ipconfig";
		int strcount = strlen(cmdstr);
		for (size_t i = 0; i < strcount; i++)
		{
			SendMessage(hcmdwindow, WM_CHAR, (WPARAM)cmdstr[i], (LPARAM)1);
		}
		PostMessage(hcmdwindow, WM_KEYDOWN, VK_RETURN, 1);


		HWND hmyapp = FindWindow("Notepad", NULL);
		HWND hmyappedit1 = FindWindowEx(hmyapp, NULL, "Edit", NULL);

		if (hmyappedit1)
		{
			printf("已找到记事本窗口,它的ID是%0x\n", hmyappedit1);
			char *str = "ipconfig";
			int count = strlen(str);
			for (size_t i = 0; i < count; i++)
			{
				SendMessage(hmyappedit1, WM_CHAR, (WPARAM)str[i], (LPARAM)1);
			}
			PostMessage(hmyappedit1, WM_KEYDOWN, VK_RETURN, 1);


		}
		else
		{
			printf("未没找到记事本文件\n");

		}

	}

	system("pause");
	return 0;
}



/*
HWND hmyapp = FindWindow(NULL,"控制cmd程序");
HWND hmyappedit = FindWindowEx(hmyapp, NULL , "Edit", NULL);
SendMessage(hmyappedit, WM_SETTEXT, NULL, (LPARAM)"HELLO");
SendMessage(hmyappedit, WM_CHAR, (WPARAM)'9', (LPARAM)2);

HWND hmyapp1 = FindWindow("Notepad", NULL);
HWND hmyappedit1 = FindWindowEx(hmyapp1, NULL, "Edit", NULL);
SendMessage(hmyappedit1, WM_CHAR, (WPARAM)'9', (LPARAM)2);

HWND hmyapp2 = FindWindow("ConsoleWindowClass", "命令提示符");
//HWND hmyappedit2 = FindWindowEx(hmyapp1, NULL, "Edit", NULL);
//SendMessage(hmyapp2, WM_CHAR, (WPARAM)'9', (LPARAM)1);
//SendMessage(hmyapp2, WM_CHAR, (WPARAM)'8', (LPARAM)1);
//PostMessage(hmyapp2,WM_KEYDOWN, VK_RETURN, 1);
//SendMessage(hmyapp2, WM_CHAR, (WPARAM)'8', (LPARAM)1);
char *str = "ipconfig";
int count = strlen(str);
for (size_t i = 0; i < count; i++)
{
SendMessage(hmyapp2, WM_CHAR, (WPARAM)str[i], (LPARAM)1);
}
PostMessage(hmyapp2, WM_KEYDOWN, VK_RETURN, 1);
char str1[100];
scanf_s("%s",str1);
printf("%d",strlen(str1));
*/
/*
for (size_t i = 0; i < strlen(str); i++)
{

SendMessage(hmyapp2, WM_CHAR, (WPARAM)str1[i], (LPARAM)1);

}
PostMessage(hmyapp2, WM_KEYDOWN, VK_RETURN, 1);
*/

最后达到的效果如下:

C语言向cmd窗口多次发送字符跨程序执行命令

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值