他のアプリケーションにキーストロークを送信するのは良い解決策ではありません。 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;
}
これを行う方法を示すいくつかの例があります:http://stackoverflow.com/questions/2113950/how-to-send-keystrokes-to-a-window。入力フィールドのフォーカスを設定する必要がある場合は、これを行う方法があると確信しています – Marged
ありがとうございました!これは間違いなく良く見えます。私が最初にこれを見つけたとき、私はこれがすべてのアプリケーションで利用できないという印象を受けました。しかし、私は間違っていたようです。私は今それを実装しようとしています。 また、私は今stackoverflowに新しいです、私は今何をするのが適切ですか?質問を閉じますか?何とかアップアップ? – SledoMalset
@Marged:これは、宛先が本当に( 'HWND'を通してアクセス可能な)ネイティブウィンドウであることを必要とします。これは事実ではないことが多く、解決策は機能しません。 UIを自動化するための、文書化されサポートされているソリューションは、[UI Automation](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)です。 – IInspectable