【发布时间】:2018-05-02 04:02:36
【问题描述】:
我正在编写一个应用程序来自动化我工作中的一些重复性任务。 我希望做的一项任务是能够自动化从 Windows 10 中的“RecoveryDrive.exe”创建恢复驱动器的过程。所有过程都已完成,但在一个步骤中,人类需要选择驱动器在 SysTreeView32 控件中。
我试图找到如何获取当前选定的treeNodeItem的文本。
我有控件的句柄,但是当我尝试阅读它时,使用网上找到的代码示例,recoveryDrive 应用程序崩溃了。
我怀疑这与 64 位/32 位与我正在使用的 api 方法不匹配以及 ASCI 和 Unicode 编码不匹配有关......我还认为我需要在目标应用程序句柄或内存中使用 LocalAlloc
here is the pasteBin of the code in the present state.
它也有我基于我的代码的 3 页。使用 sendMessage 时,GetTreeItemText 函数中的应用程序崩溃。
我找到了一些关于如何在 C++ 中执行此操作的示例,但我不太了解。
public static string GetTreeItemText(IntPtr treeViewHwnd, IntPtr hItem)
{
int ret;
TVITEM tvi = new TVITEM();
IntPtr pszText = LocalAlloc(0x40, MY_MAXLVITEMTEXT);
tvi.mask = TVIF_TEXT;
tvi.hItem = hItem;
tvi.cchTextMax = MY_MAXLVITEMTEXT;
tvi.pszText = pszText;
ret = SendMessageTVI(treeViewHwnd, TVM_GETITEM, 0, ref tvi);
string buffer = Marshal.PtrToStringUni((IntPtr)tvi.pszText,
MY_MAXLVITEMTEXT);
//char[] arr = buffer.ToCharArray(); //<== use this array to look at the bytes in debug mode
LocalFree(pszText);
return buffer;
}
【问题讨论】:
-
为什么不使用 UIAutomation?
-
你正在另一个进程中访问内存,你必须用
VirtualAllocEx分配内存。调用者和目标之间的 32 位/64 位匹配也很重要。 ANSI/Unicode 匹配无关紧要(我认为只要源应用程序是 Unicode 就可以了)在 C# 中,与这种方法相比,使用 UI 自动化应该更容易。 -
我认为只有核心消息会被自动编组,所以在控件上使用跨进程 SendMessage 是行不通的。
-
@bunglehead 它确实有效,您只需要手动编组内存缓冲区
标签: c# winapi sendmessage win32gui