【问题标题】:Setting all checkboxes in a listView in another application with winAPI使用 winAPI 在另一个应用程序的 listView 中设置所有复选框
【发布时间】:2016-04-28 14:19:26
【问题描述】:

所以我有这段代码可以使用 sendmessage 为另一个应用程序中的列表视图设置所有项目(甚至是一个项目,我声明了项目编号 3 的代码),我已经成功地获得了列表视图的项目窗口句柄和项目计数正确,但是当我使用 setitemstate 时,另一个应用程序给了我错误并关闭(鉴于我有另一个应用程序可以很好地完成这项工作,但我没有它的源代码)

这是我的代码:

if (windowName.Contains("Invite to Room")) {
    IntPtr hwndChild0 = FindWindowEx(hWnd, IntPtr.Zero, "SysListView32", "");

    int itemCount = SendMessage(hwndChild0, LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);

    LV_ITEM lvItem = new LV_ITEM();
    lvItem.Index = 3;
    lvItem.SubIndex = 2;
    lvItem.TextLength = 50;
    lvItem.Mask = LVIF_STATE;
    lvItem.State = LVIS_SELECTED;
    lvItem.StateMask = LVIS_SELECTED;

    SendMessage(hwndChild0, LVM_SETITEMSTATE, 3, IntPtr.Zero);
}

这是我的 LV_ITEM 结构

public struct LV_ITEM
{
    public uint Mask;
    public int Index;
    public int SubIndex;
    public int State;
    public IntPtr StateMask;
    public string Text;
    public int TextLength;
    public int ImageIndex;
    public IntPtr LParam;
}

这是使用的声明(sendmessage 和 setitemstate)

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam);

private const uint LVM_FIRST = 0x1000;
private const uint LVM_SETITEMSTATE = (LVM_FIRST + 43);

有什么帮助吗?

编辑:

应用程序错误有一个日志文件,其中包含以下消息: "线程试图读取或写入它没有适当访问权限的虚拟地址"

【问题讨论】:

  • 很好地说明它给出错误并关闭没有任何好处..实际错误是什么..?
  • 没有错误,只是没有按照预期的那样做正确的行为
  • 它是否给出错误?如果它给出一个错误,哪个?如果不是,什么是“不做正确的行为”?请说得更具体些。
  • @Gusman 好的,至于调试完全没有例外,对于其他应用程序,它给了我错误“致命异常”“Paltalk 遇到错误并即将关闭”
  • @Gusman 编辑了它标题:“致命异常”内容:“Paltalk 遇到错误并即将关闭”

标签: c# listview winapi sendmessage


【解决方案1】:

某些消息仅使用WPARAMLPARAM 并返回LRESULT 来传递数据,例如适合您的LVM_GETITEMCOUNT

其他消息使用指向要使用或填充的某些数据结构的指针,例如LVM_SETITEMSTATE。当您传递IntPtr.Zero 时,它需要一个指向LPARAM 中预填充的LV_ITEM 结构的指针,因此您会在尝试取消引用该零指针的其他应用程序中导致访问冲突。

但是,您不能简单地将指针传递给您的lvItem,因为它在另一个进程中没有任何意义。您需要在第二个进程中为该结构分配内存,对其进行初始化,向您发送消息并读回该内存(如果您期望任何响应)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2014-06-30
    相关资源
    最近更新 更多