Как сказал Тимо в комментарии, вы можете получить дескриптор окна «Блокнот», а затем использовать его для записи текста в него, и вам даже не потребуется вводить вашу DLL в процесс «Блокнот».
В Windows каждое окно получает сообщения от операционной системы (или от других программ, например, что вы собираетесь попробовать), эти сообщения сообщают окну, какое действие было выполнено, например - Нажатие вниз ключ или нажатие кнопки мыши. Таким образом, программа, управляющая окном, будет знать, какое действие она должна делать.
Вы можете использовать инструмент Spy ++ (spyxx.exe, встроенный в каждую Visual Studio), чтобы отслеживать, что делает Windows когда вы нажимаете клавишу вниз на клавиатуре в окне блокнота. Вы можете узнать больше о topi c оконных сообщениях здесь: https://docs.microsoft.com/en-us/windows/win32/learnwin32/window-messages
И работа со Spy ++ здесь: https://docs.microsoft.com/en-us/visualstudio/debugger/introducing-spy-increment?view=vs-2019
Открывая Spy ++, мы можем видеть все Windows в нашем сеансе, и мы ищем Блокнот: как это выглядит
Маленький ПО C Я сделал для поиска подходящего Окно, в соответствии с тем, что обнаружил Spy ++ (простите меня за глобальные переменные, и убедитесь, что вы знаете, что я здесь сделал):
HWND notepad_window;
HWND notepad_edit;
BOOL CALLBACK GetEditWindow(HWND hWnd, LPARAM lParam)
{
wchar_t window_text[MAX_PATH] = { 0 };
if (0 != GetClassNameW(hWnd, window_text, MAX_PATH))
{
std::wstring text(window_text);
if (std::wstring::npos != text.find(L"Edit"))
{
std::wcout << "Found it" << text << std::endl;
notepad_edit = hWnd;
return false;
}
}
return true;
}
BOOL CALLBACK GetNotepadWindow(HWND hWnd, LPARAM lParam)
{
wchar_t window_text[MAX_PATH] = { 0 };
// Fun fact - The GetWindowTextW also posts a window message to the window, the WM_GETTEXT message
if (0 != GetWindowTextW(hWnd, window_text, MAX_PATH))
{
std::wstring text(window_text);
if (std::wstring::npos != text.find(L"Notepad"))
{
std::wcout << "Found it" << text << std::endl;
notepad_window = hWnd;
return false;
}
}
return true;
}
int wmain()
{
EnumWindows(GetNotepadWindow, 0);
EnumChildWindows(notepad_window, GetEditWindow, 0);
}
После того, как у вас есть HWND, вы можете начать работать с сообщением проводка. Вы можете снова использовать Spy ++, чтобы «постучать» по окну редактирования Блокнота и увидеть каждое сообщение окна, отправленное при нажатии клавиши, вы увидите WM_KEYDOWN, за которым, скорее всего, следует WM_KEYUP.
Затем вы можете используйте функцию PostMessage WinAPI, чтобы публиковать ваши собственные сообщения WM_KEYDOWN / KEYUP в окне блокнота, следовательно, контролировать вход, который он получает.