0

正如我的标题所述,我正在尝试从我正在编写的 C++ 应用程序中移动数据,并将其输入到 Windows 中任何桌面应用程序的字段(特别是用户名和密码字段)中。它需要适用于所有应用程序。

现在我已经编写了一个小程序,它将数据复制到剪贴板,然后模拟 Ctrl+V 键盘按下以粘贴数据。然而,这样做感觉非常丑陋。我的问题是,有没有更好的方法?

附言。从我所做的研究来看,一切似乎都需要您以某种方式修改接收应用程序。不幸的是,我无法使用此选项。因此,任何涉及调整接收应用程序的解决方案都无济于事。

谢谢您的帮助!

4

1 回答 1

0

将击键发送到另一个应用程序不是一个好的解决方案。有许多潜在的问题,例如在C# 中将其他应用程序的密钥发送到特定的 textfield。更好的解决方案是更直接地与其他程序交互。但是,它需要对 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;
}
于 2016-04-16T02:02:53.097 回答