获取了DOS窗口的句柄,如何向DOS写入数据

河静水深-人静心深 2014-05-20 05:14:16
我获取了DOS窗口的句柄,怎么向里面写入字符呢,比如输入"123"这几个字符,用什么api实现呢?
...全文
563 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq329838102 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
用SendMessage发送WM_CHAR或WM_IME_CHAR消息也可以实现

wchar_t wsz[] = L"Hello,我是小明";
for (size_t i=0; i<wcslen(wsz); i++)
	::SendMessage(hCmdWnd, WM_CHAR, wsz[i], NULL);
我有一个类似的问题,请问如果我想要传入wsz[]是一个变量,那没有办法在这之前加上“L”来标识头它是一个Unicode字符,怎么样来应对这种情况???
schlafenhamster 2014-05-29
  • 打赏
  • 举报
回复
你的 复制 内容 前 加 echo 命令, 形成: echo “复制的内容”。
  • 打赏
  • 举报
回复
引用 14 楼 CharlesSimonyi 的回复:
楼主不妨说下你的具体需求,我们好分析要如何实现
我其实是想在dos下面实现ctrl+v的操作,我的想法是安装键盘钩子,判断如果是dos窗口,ctrl+v就向dos输入复制的内容,,就是这个想法,谢谢你的回复.
  • 打赏
  • 举报
回复
引用 12 楼 CharlesSimonyi 的回复:
SendInput和SendMeesage都是模拟对cmd黑窗口进行一些键盘输入,它是可以完全等同于人手工对着cmd黑窗口用键盘输入内容的。不知道你说的"不是内部或外部命令,也不是可运行的程序"是什么情况下发生,举个例子?
如果我复制了一段内容,这些内容中有回车键的话,如果我sendmessage发送WM_CHAR到dos窗口,这种情况下就会出现我说的"不是内部或外部命令,也不是可运行的程序"
l357630798 2014-05-28
  • 打赏
  • 举报
回复
代码如下:
#include <iostream>
#define _AFXDLL
#include <afx.h>
#include <Windows.h>

using namespace std;

int main()
{
	HANDLE hRead_ReadPipe = NULL, hWrite_ReadPipe = NULL;
	HANDLE hRead_WritePipe = NULL, hWrite_WritePipe = NULL;
	char CmdPath[] = "C:\\windows\\system32\\cmd.exe";

	SECURITY_ATTRIBUTES sa;
	sa.bInheritHandle = true;
	sa.lpSecurityDescriptor = NULL;
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);

	::CreatePipe(&hRead_ReadPipe, &hWrite_ReadPipe, &sa, 0);
	::CreatePipe(&hRead_WritePipe, &hWrite_WritePipe, &sa, 0);

	STARTUPINFO si;
	::ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESTDHANDLES;
	si.hStdInput = hRead_WritePipe;
	si.hStdOutput = si.hStdError = hWrite_ReadPipe;
	PROCESS_INFORMATION pi;
	::CreateProcess(NULL, CmdPath, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
	::CloseHandle(pi.hThread);
	::CloseHandle(pi.hProcess);

	DWORD dwCount = 0;
	char szCmd[] = "ipconfig /all\r\n";
	WriteFile(hWrite_WritePipe, szCmd, sizeof(szCmd), &dwCount, NULL);

	Sleep(2000);
	char buffer[2048];
	memset(buffer, sizeof(buffer), 0);
	ReadFile(hRead_ReadPipe, buffer, sizeof(buffer), &dwCount, NULL);
	cout << buffer << endl;
	getchar();
	return 0;
}
l357630798 2014-05-28
  • 打赏
  • 举报
回复
用1楼大神的方法,直接用两个管道啊。进行读写操作啊。 首先,在你的当前程序里面使用CreateProcess调用cmd,然后再创建两个管道把cmd和你的程序连接起来,就可以很方便的通讯了。
encoderlee 2014-05-28
  • 打赏
  • 举报
回复
引用 15 楼 zhangyonghui2117 的回复:
引用 14 楼 CharlesSimonyi 的回复:
楼主不妨说下你的具体需求,我们好分析要如何实现
你8楼的方法为什么我的不能测试通过呢,dos窗口没有字
HWND hCMDwnd=reinterpret_cast<HWND>(0x00050222); 。。。这个0x00050222句柄值是我测试的时候我电脑上的CMD窗口句柄。 在你电脑上肯定不一样,你得自行获取,通过Findwindow等函数或在SPY++中查找。
「已注销」 2014-05-28
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
用SendMessage发送WM_CHAR或WM_IME_CHAR消息也可以实现

wchar_t wsz[] = L"Hello,我是小明";
for (size_t i=0; i<wcslen(wsz); i++)
	::SendMessage(hCmdWnd, WM_CHAR, wsz[i], NULL);
#include <windows.h>

#include <iostream>
using namespace std;   
int main( ) 
{
	HWND hCMDwnd=reinterpret_cast<HWND>(0x00050222);

	wchar_t wch[]=L"Hello,我是小明";
	for(size_t i=0;i<wcslen(wch);i++)
		::SendMessage(hCMDwnd,WM_CHAR,wch[i],NULL);

	return 0;
}
哪里错了,怎么测试不通过,dos窗口没有字
「已注销」 2014-05-28
  • 打赏
  • 举报
回复
引用 14 楼 CharlesSimonyi 的回复:
楼主不妨说下你的具体需求,我们好分析要如何实现
你8楼的方法为什么我的不能测试通过呢,dos窗口没有字
encoderlee 2014-05-28
  • 打赏
  • 举报
回复
楼主不妨说下你的具体需求,我们好分析要如何实现
schlafenhamster 2014-05-28
  • 打赏
  • 举报
回复
"你这个方法是可以,但是如果有回车换行符" 就会 当成 命令 来 执行, 这是 cmd 的 工作 方法。 如 : ecko “abcdefg” 回车换行就 输出 abcdefg
encoderlee 2014-05-28
  • 打赏
  • 举报
回复
SendInput和SendMeesage都是模拟对cmd黑窗口进行一些键盘输入,它是可以完全等同于人手工对着cmd黑窗口用键盘输入内容的。不知道你说的"不是内部或外部命令,也不是可运行的程序"是什么情况下发生,举个例子?
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
还有前面几位提到的SendInput和管道都可以。 SendInput是模拟键盘输入,要求目标程序的黑窗口在最前端并且处于有输入焦点的状态。 SendMeesage方式不要求目标程序的黑窗口在最前端并且处于有输入焦点的状态,目标程序的黑窗口在最小化状态下也可以模拟输入。 用管道的话好处就是可以让目标程序的cmd黑窗口彻底不出现,完全静默的在后台操作。
你这个方法是可以,但是如何有回车换行符,dos就会当做是条命令解析,结果就会说"不是内部或外部命令,也不是可运行的程序"
Eleven 2014-05-21
  • 打赏
  • 举报
回复
引用 2 楼 qu_tao 的回复:
[quote=引用 1 楼 oyljerry 的回复:] dos窗口用管道方式比较好
我在一个程序中怎么用管道?只有dos的句柄而已,[/quote] 这个cmd程序是你开发的吗?有代码吗?
  • 打赏
  • 举报
回复
看起来只有SendInput了
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
dos窗口用管道方式比较好
我在一个程序中怎么用管道?只有dos的句柄而已,
wu4357815 2014-05-21
  • 打赏
  • 举报
回复
8楼正解。。。。。。
encoderlee 2014-05-21
  • 打赏
  • 举报
回复
还有前面几位提到的SendInput和管道都可以。 SendInput是模拟键盘输入,要求目标程序的黑窗口在最前端并且处于有输入焦点的状态。 SendMeesage方式不要求目标程序的黑窗口在最前端并且处于有输入焦点的状态,目标程序的黑窗口在最小化状态下也可以模拟输入。 用管道的话好处就是可以让目标程序的cmd黑窗口彻底不出现,完全静默的在后台操作。
encoderlee 2014-05-21
  • 打赏
  • 举报
回复
用SendMessage发送WM_CHAR或WM_IME_CHAR消息也可以实现

wchar_t wsz[] = L"Hello,我是小明";
for (size_t i=0; i<wcslen(wsz); i++)
::SendMessage(hCmdWnd, WM_CHAR, wsz[i], NULL);


encoderlee 2014-05-21
  • 打赏
  • 举报
回复
要看你的目的是什么? 你是想: 1.你双击运行一个A.exe,这个程序是一个控制台程序,运行以后出现CMD黑窗口,通过输入命令来操作A.exe这个软件,现在你想写一个程序B.exe,运行后可以模拟人的手工输入,自动在CMD黑窗口中输入命令来操作A.exe这个软件。 还是想: 2.你运行cmd.exe,出现黑窗口,你现在想写一个程序,来模拟人的手工输入,执行一些cmd命令,如dir c:\ del c:\file.txt 还是想: 3.其它...
加载更多回复(3)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧