Я разрабатываю часть программного обеспечения для извлечения некоторой информации из внешнего настольного приложения, дело в том, что я работаю в Windows 7 с использованием С#, и у меня есть работающее приложение, которое использует материал здесь:
Как я могу получить значения из окна класса ThunderRT6ListBox с использованием user32.dll в c#
Но проблема возникает, когда я тестирую одно и то же программное обеспечение с тем же внешним приложением в Windows 8, оно работает по-разному.
Я могу скопировать идентификатор обработчика элементов управления, но когда я использую функцию 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