私は外部デスクトップアプリケーションからいくつかの情報を抽出するソフトウェアを開発しています.C#を使用してWindows 7で作業しており、ここのものを使用する実行可能なアプリケーションを持っています:
c#でuser32.dllを使用してクラス「ThunderRT6ListBox」のウィンドウから値を取得するにはどうすればよいですか
しかし、Windows 8 で同じ外部アプリケーションに対して同じソフトウェアをテストすると、同じように動作しないという問題が発生します。
コントロールのハンドラ ID をコピーすることはできますが、SendMessage 関数を使用して新しいテキストをエディット コントロール (テキスト ボックス) に入れるなどしても、何も起こりません。
public static void SetText(IntPtr HWnd, string strTextToSet)
{
var text = new StringBuilder(strTextToSet);
SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
}
Windows 8 でこのようなものを使用した場合、考慮事項はありますか?
アップデート:
それでもうまくいきません。GetText は機能しますが、SetText は機能しません。
私のコード:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
const uint WM_SETTEXT = 0x000C;
public static string GetText(IntPtr hwnd)
{
var text = new StringBuilder(1024);
if (SendMessageTimeoutText(hwnd, 0xd, 1024, text, 0x2, 1000, 0) != 0)
{
return text.ToString();
}
return "";
}
public static void SetText(IntPtr HWnd, string strTextToSet)
{
//var text = new StringBuilder(strTextToSet);
IntPtr text = System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(strTextToSet);
SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
}
更新 2:
エラーコード:
ModApi.SetText(hwEdit, "foo_namE");
//The textbox does not change
int error_code = Marshal.GetLastWin32Error();
//error_code is 5