VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 613|回复: 2

请各位大侠,我如何使用我的WIN32程序控制其他DOS程序的键盘输入?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-30 13:40:01 | 显示全部楼层 |阅读模式
问题如下,还望各位赐教
已有一个DOS程序,(它也可能是windows控制台的程序),没有源代码,
我想通过我的程序,调起这个dos可执行程序,起来后,我的程序模拟系统的键盘给它输入,好像它自己运行,而客户从键盘敲入信息一样。
不好意思,以前没有接触过这类东东,请给个方法,越详细越好,最好还告诉我如何将它的窗口隐藏掉,非常感谢,在线等。
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-30 17:45:01 | 显示全部楼层
重定向,给你个例子:
char cmdbuffer[1024];
HANDLE hReadPipe;
HANDLE hReadPipe2;
HANDLE hWritePipe;
HANDLE hWritePipe2;

DWORD __stdcall ThreadFun(void *pVoid)
{
        HWND hwnd = *((HWND *)pVoid);
       
        SECURITY_ATTRIBUTES sat;
        STARTUPINFO startupinfo;
        PROCESS_INFORMATION pinfo;
        BYTE buffer[1024];
        DWORD byteRead;
        CString rString;
       
       
        sat.nLength=sizeof(SECURITY_ATTRIBUTES);
        sat.bInheritHandle=true;
        sat.lpSecurityDescriptor=NULL;
        if(!CreatePipe(&hReadPipe,&hWritePipe,&sat,NULL))
        {
                MessageBox(NULL,"Create Pipe Error!","error!",MB_OK);
                return 0;
        }
        if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sat,NULL))
        {
                MessageBox(NULL,"Create Pipe2 Error!","error!",MB_OK);
                return 0;
        }
        startupinfo.cb=sizeof(STARTUPINFO);
        GetStartupInfo(&startupinfo);
        startupinfo.hStdError=hWritePipe;
        startupinfo.hStdOutput=hWritePipe;
        startupinfo.hStdInput=hReadPipe2;
        startupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        startupinfo.wShowWindow=SW_HIDE;
        if(!CreateProcess(NULL,"c:\\winnt\\system32\\cmd.exe",NULL, NULL, TRUE, NULL, NULL, NULL,&startupinfo,&pinfo))
        {
                MessageBox(NULL,"create process error!","Error!",MB_OK);
                return 0;
        }
        CloseHandle(hWritePipe);
        CloseHandle(hReadPipe2);
        CloseHandle(pinfo.hThread);
        CloseHandle(pinfo.hProcess);
       
        while(true)
        {
                RtlZeroMemory(buffer,1024);
                if(ReadFile(hReadPipe,buffer,1023,&byteRead,NULL)==NULL)
                        break;
                //buffer里就是屏幕上显示的内容       
        }
        CloseHandle(hReadPipe);       
        CloseHandle(hWritePipe2);
        return 0;
}

//创建线程:
HANDLE hThread = NULL;
        hThread = CreateThread(NULL,0,ThreadFun,&m_hWnd,0,&dwThreadId);//m_hWnd这个参数你根据你的需要决定要不要
        if (hThread == NULL)
        {
                MessageBox("CreateThread failed.", "main", MB_OK );
        }
        else
        {
                CloseHandle( hThread );
        }

//往consel程序里写命令:
strcpy(cmdbuffer,"dir");
strcat(cmdbuffer,"\r\n");//一定要有回车换行
WriteFile(hWritePipe2,cmdbuffer,strlen(cmdbuffer),&byteRead,NULL);
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-4-28 12:45:01 | 显示全部楼层
谢谢moon_archer!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表