Вставка данных в любое поле ввода приложения без симуляции Ctrl + V. Переполнение стека Windows

Как гласит мой заголовок, я пытаюсь переместить данные из приложения C ++, которое я пишу, и ввести их в поле (в частности, поля имени пользователя и пароля) в любом настольном приложении в Windows. Это должно работать для всех приложений.

Теперь я уже написал небольшую программу, которая копирует данные в буфер обмена, а затем имитирует нажатие клавиши Ctrl + V для вставки данных. Однако это кажется ужасно уродливым способом сделать это. У меня вопрос, есть ли лучший способ?

Ps. Из проведенного мною исследования, кажется, все требует, чтобы вы каким-то образом модифицировали принимающее приложение. Эта опция, к сожалению, недоступна для меня. Поэтому любые решения, связанные с настройкой принимающего приложения, не будут полезны

Спасибо за помощь!

-1

Решение

Отправка нажатий клавиш в другое приложение не является хорошим решением. Есть много потенциальных проблем, таких как в C # sendkeys для другого приложения для конкретного текстового поля. Лучшим решением является более непосредственное взаимодействие с другой программой. Однако требуется немного больше технического понимания того, как работает Windows. Одним из многих преимуществ является то, что вы можете читать текст в другом приложении так же легко, как написать его.

См мой Нажатие кнопки в другом приложении для образца, но это в C #. Я надеюсь, что объяснение по крайней мере полезно. Та же самая техника может использоваться, чтобы поместить данные в текстовое поле или текстовые поля, а затем нажать кнопку. WM_SETTEXT сообщение будет использоваться для помещения данных в текстовое поле в другом приложении. Ниже приведен пример консольной программы, которая помещает текст в Блокнот.

#include "stdafx.h"
struct pidandhwnd {
DWORD dwProcessId;
HWND hwnd;
};

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
pidandhwnd *ppnh = (pidandhwnd *)lParam;
DWORD dwProcessId;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if (ppnh->dwProcessId == dwProcessId)
{
ppnh->hwnd = hwnd;
return FALSE;
}
return TRUE;
}

int main()
{
TCHAR szCmdline[] = TEXT("Notepad.exe");
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bSuccess = FALSE;

ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = NULL;
siStartInfo.hStdOutput = NULL;
siStartInfo.hStdInput = NULL;

LPARAM lParam = NULL;
pidandhwnd pnh;

const int ControlId = 15;   // Edit control in Notepad
HWND hEditWnd;

bSuccess = CreateProcess(NULL,
szCmdline,     // command line
NULL,          // process security attributes
NULL,          // primary thread security attributes
TRUE,          // handles are inherited
0,             // creation flags
NULL,          // use parent's environment
NULL,          // use parent's current directory
&siStartInfo,  // STARTUPINFO pointer
&piProcInfo);  // receives PROCESS_INFORMATION
if (!bSuccess) {
std::cout << "Process not started\n";
return 0;
}
std::cout << piProcInfo.dwProcessId << " Notepad Process Id\n";

WaitForInputIdle(piProcInfo.hProcess, 1000);

pnh.dwProcessId = piProcInfo.dwProcessId;
pnh.hwnd = NULL;
EnumDesktopWindows(NULL, EnumWindowsProc, (LPARAM)&pnh);
if (pnh.hwnd == NULL)
{
std::cout << "Notepad not found\n";
return 0;
}
//std::cout << "Notepad found\n";

// Get the edit box on Notepad
hEditWnd = GetDlgItem(pnh.hwnd, ControlId);
// Send the text
SendMessage(hEditWnd, WM_SETTEXT, NULL, (LPARAM)_T("This is from somewhere else."));

return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]