2016-04-15 10 views
-1

私のタイトルとして、私は書いているC++アプリケーションからデータを移動し、それをウィンドウ内のデスクトップアプリケーションのフィールド(特にユーザー名とパスワードフィールド)に入力しようとしています。すべてのアプリケーションで動作する必要があります。Ctrl + Vをシミュレートせずに、アプリケーションの入力フィールドにデータを貼り付けます。 WindowsのC++

私は既にデータをクリップボードにコピーし、次にCtrl + Vキーボードをシミュレートしてデータを貼り付けます。これはひどく醜い方法です。私の質問は、より良い方法があるということですか?

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

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

+0

これを行う方法を示すいくつかの例があります:http://stackoverflow.com/questions/2113950/how-to-send-keystrokes-to-a-window。入力フィールドのフォーカスを設定する必要がある場合は、これを行う方法があると確信しています – Marged

+0

ありがとうございました!これは間違いなく良く見えます。私が最初にこれを見つけたとき、私はこれがすべてのアプリケーションで利用できないという印象を受けました。しかし、私は間違っていたようです。私は今それを実装しようとしています。 また、私は今stackoverflowに新しいです、私は今何をするのが適切ですか?質問を閉じますか?何とかアップアップ? – SledoMalset

+0

@Marged:これは、宛先が本当に( 'HWND'を通してアクセス可能な)ネイティブウィンドウであることを必要とします。これは事実ではないことが多く、解決策は機能しません。 UIを自動化するための、文書化されサポートされているソリューションは、[UI Automation](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)です。 – IInspectable

答えて

0

他のアプリケーションにキーストロークを送信するのは良い解決策ではありません。 C# sendkeys to other application to particular textfieldなど多くの潜在的な問題があります。より良い解決策は、他のプログラムとより直接的にインターフェースすることです。しかし、Windowsの仕組みについての技術的な理解がもう少し必要です。多くの利点の1つは、他のアプリケーションのテキストを簡単に書くことができるということです。

サンプルでは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; 
} 
+0

詳細な回答をありがとう!(それに遅れて返答してくれて申し訳ありません)問題がなければ、私はいくつか質問をしています。 ボタンの例をクリックすると、それは私にとって非常に便利なようですが、OSの知識ではまだ100%ではありません。 spy ++に影響されないアプリケーションはありますか?つまり、テキストボックス(私の場合はユーザー名/パスワード)にアクセスできない特定のクラスのアプリケーションがあるのですか、またはこれらのフィールドが常にspy ++にアクセスできるようなOSですか? – SledoMalset

+0

私はこれをもっと早く見ないことをお詫びします。これは、新しいテクノロジーを使用するソフトウェアでは機能しませんが、同等のソリューションがあるかどうかはわかりません。私はまた、アプリケーションがこの種のものからどれくらい守ることができるかも知らない。彼らはいくつかの可能性がありますが、おそらく完全ではありません詳細について質問するために新しい質問を作成することができます。 – user34660

関連する問題