WM_CHAR不能与notepad.exe一起使用

时间:2015-05-22 21:35:11

标签: c winapi sendmessage

我使用的是Windows 7和Microsoft Visual Studio 2010.我使用此代码将数字字符插入到calc.exe的窗口中:

STARTUPINFO         si  = { 0 };
PROCESS_INFORMATION pi  = { 0 };

memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));

si.cb = sizeof(si);

BOOL bResult = CreateProcess("c:\\windows\\syswow64\\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForInputIdle(pi.hProcess, INFINITE);
HWND hWnd = FindWindow("CalcFrame", NULL);

PostMessage(hWnd, WM_CHAR, (WPARAM)'1', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'2', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'3', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'4', 0);

此代码非常完美。当我将"c:\\windows\\syswow64\\calc.exe"替换为"c:\\windows\\syswow64\\notepad.exe""CalcFrame"替换为"Notepad"时,它不会在记事本窗口中插入字符。

1 个答案:

答案 0 :(得分:2)

在记事本的主窗口的客户区域内有一个类EDIT的子窗口。对于您正在做的事情,您需要找到并发送消息到那个窗口而不是记事本的主窗口。

BOOL bResult = CreateProcess("c:\\windows\\syswow64\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForInputIdle(pi.hProcess, INFINITE);
HWND hWnd = FindWindow("Notepad", NULL);
hWnd = FindWindowEx(hWnd, NULL, "EDIT", NULL); // <-- add this

PostMessage(hWnd, WM_CHAR, (WPARAM)'1', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'2', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'3', 0);
PostMessage(hWnd, WM_CHAR, (WPARAM)'4', 0);

使用Spy ++探索窗口层次结构并找到这些东西。