我正在开发一个软件来从外部桌面应用程序中提取一些信息,问题是我正在使用 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