0

タイトルが示すように、作成中の C++ アプリケーションからデータを移動し、それを Windows のデスクトップ アプリケーションのフィールド (具体的にはユーザー名とパスワードのフィールド) に入力しようとしています。すべてのアプリケーションで機能する必要があります。

これで、データをクリップボードにコピーし、Ctrl + V キーボードを押してデータを貼り付けるようにシミュレートする小さなプログラムを既に作成しました。ただし、これは非常に醜い方法です。私の質問は、より良い方法はありますか?

Ps。私が行った調査によると、受信アプリケーションを何らかの方法で変更する必要があるようです。残念ながら、このオプションは私には利用できません。したがって、受信アプリケーションの微調整を含むソリューションは役に立ちません。

ご協力ありがとうございました!

4

1 に答える 1

0

キーストロークを別のアプリケーションに送信することは、良い解決策ではありません。C# sendkeys to other application to specific textfieldなど、多くの潜在的な問題があります。より良い解決策は、他のプログラムとより直接的にやり取りすることです。ただし、Windows がどのように機能するかについて、もう少し技術的な理解が必要です。多くの利点の 1 つは、他のアプリケーションでテキストを書くのと同じくらい簡単に読むことができることです。

サンプルについては、別のアプリケーションでボタンをクリックするを参照してください。ただし、これは 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 に答える