将数据粘贴到任何应用程序输入字段而不模拟Ctrl + V. Windows c ++

时间:2016-04-15 08:48:25

标签: c++ windows single-sign-on pasting

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

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

聚苯乙烯。从我做过的研究来看,似乎要求你以某种方式修改接收应用程序。遗憾的是,我无法使用此选项。所以任何涉及调整接收应用程序的解决方案都没有帮助。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

向另一个应用程序发送击键不是一个好的解决方案。有许多潜在的问题,例如C# sendkeys to other application to particular textfield。更好的解决方案是更直接地与其他程序连接。但是,它需要对Windows的工作原理有一点技术性的了解。许多优点之一是您可以像编写文本一样轻松地阅读其他应用程序中的文本。

请参阅我的Clicking a Button in Another Application获取示例,但这是在C#中。我希望这个解释至少是有帮助的。可以使用相同的技术将数据放入文本框或文本框,然后单击按钮。 WM_SETTEXT message将用于将数据放入另一个应用程序的文本框中。以下是将文本放入记事本的示例控制台程序。

#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;
}