〓〓Win32 非console程序在cmd下启动后如何在这个cmd窗口下进行输入输出
写了一个服务程序,不是console的Win32 Application,就是一个支持MFC的没有窗口的服务程序(比如myserver.exe),当用户在自己打开的cmd命令窗口下启动:
D:\Test\Debug>myserver.exe
启动之后,想在myserver这个进程中对这个cmd进行控制以便可以进行输入和输出,即在这个cmd命令状态下实现人机交互。
我试过用AllocConsole(),这个是新开一个cmd窗口,然后可以在新创建的窗口通过WriteConsole和ReadConsole函数进行输入输出操作,但是现在不想用这个AllocConsole来新建,就想利用当前的cmd窗口。
在MSDN下的Console Functions中没有找到相应的函数,有SetStdHandle 和 GetStdHandle 这两个函数,其中SetStdHandle函数:
BOOL SetStdHandle(
DWORD nStdHandle, // input, output, or error device
HANDLE hHandle // handle
);
这个hHandle参数如何获取,尝试通过HWND hCmd=::FindWindow(_T("ConsoleWindowClass"),_T("C:\\WINDOWS\\system32\\cmd.exe"));
:SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)hCmd);
这样来获取,但是执行WriteConsole之后,cmd界面没有任何输出响应,不解。
请问那位知道如何来实现这样的功能?急!
[解决办法]
以下代码经过测试,解决些小问题,完美达到楼主要求。
代码如下:
#define _WIN32_WINNT 0x500
...
#define ProcessBasicInformation 0
typedef struct
{
DWORD ExitStatus;
DWORD PebBaseAddress;
DWORD AffinityMask;
DWORD BasePriority;
ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE, UINT, PVOID, ULONG, PULONG);
PROCNTQSIP NtQueryInformationProcess;
void CMFCDialogApplicationDlg::OnButton()
{
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQueryInformationProcess");
HANDLE hProcess;
PROCESS_BASIC_INFORMATION pbi;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());
NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&pbi,
sizeof(PROCESS_BASIC_INFORMATION), NULL);
CloseHandle(hProcess);
AttachConsole(pbi.InheritedFromUniqueProcessId);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
char szText[256] = "Hello World\n";
DWORD dwReturn = 0;
WriteConsoleA(hOut, szText, strlen(szText), &dwReturn, NULL);
do
{
INPUT_RECORD e;
e.EventType = KEY_EVENT;
e.Event.KeyEvent.uChar.AsciiChar = '\r';
WriteConsoleInput(hIn, &e, sizeof(INPUT_RECORD), &dwReturn);
memset(szText, 0, 256);
ReadConsole(hIn, szText, 256, &dwReturn, NULL);
system(szText);
MessageBox(szText);
} while (TRUE);
}
代码未处理出错情况,楼主根据需要添加。