【问题标题】:How do I find a item in ListView control?如何在 ListView 控件中查找项目?
【发布时间】:2011-08-07 00:45:36
【问题描述】:

我的列表视图包含 3 列名称、地址和电话号码。

我想检索特定名称的索引。

我正在使用ListView_FindItem 宏来查找索引号,但是当我的代码到达这一行时,它会使程序崩溃。

它只是说工资单已停止工作。 Windows 可以在线检查问题的解决方案。

我确定我已将右句柄传递给 ListView_FindItem 宏,但我不确定 LVFINDINFO 结构。

这是我的代码

WCHAR szProcess[80] = {0};
LVFINDINFO item = {LVFI_STRING, (LPCTSTR) szProcess};

//code to find parent handles
...

//code to find index
index = ListView_FindItem(hwndListView, -1, &item);

我不确定LVFI_STRING 标志,我什至尝试将常量LVFINDINFO 结构传递给ListView_FindItem 宏,但我的程序仍然崩溃。

注意:以上代码不属于 工资单应用程序。我想说 工资单应用程序有 listview,我正在尝试搜索 来自其他应用程序的项目。

有人能指出我正确的方向吗?

谢谢。

【问题讨论】:

  • 您不能转换字符串类型。发布异常的堆栈跟踪。
  • @Hans Passant 我如何找到堆栈跟踪?我没有 Visual Studio。还有其他选择吗?
  • 尝试在没有调试器的情况下调试代码是毫无意义的。你为什么还要尝试?
  • @Hans Passant 我只有 Windows SDK。到达大学后,我将发布堆栈跟踪。

标签: c winapi listview ipc


【解决方案1】:

您的描述有点不清楚,但我认为您正在将LVM_FINDITEM 消息(通过ListView_FindItem() 宏)发送到不同进程中的窗口。

这根本不适用于这个特定的 Windows 消息,因为它传递了一个指向调用进程中的结构的指针,当在其他进程(拥有列表视图的工资单应用程序)的上下文中解释时,该结构毫无意义。

要解决您的问题,您可以在其他进程中分配内存,尽管这是一项相当复杂的任务。在代码项目文章Stealing Program's Memory 中可以找到该技术的一个常用示例。

也许更简单的方法是使用 WM_COPYDATA 在进程之间编组字符串数据。如果这没有足够的灵活性,那么您需要找到另一种 IPC 机制,例如命名管道。

【讨论】:

  • @Searock,它有用吗?我尝试了 CodeProject 方法从另一个进程中获取列标题的标题,并且效果很好。我感到困惑的是,调用GetWindowText() 的工作方式相同:您将指针传递给缓冲区以将字符串放入其中,但 确实 适用于来自另一个进程的窗口。 :-?
  • @Synetech 是的,它有效。我不确定为什么GetWindowText() 不适合你。您也可以获取其他进程的窗口文本。如果你能告诉我你的代码,也许我可以帮忙。
  • @Searock, GetWindowText() 确实工作;这就是令人困惑的地方。它需要一个缓冲区,就像FindItemGetColumn 一样,但是虽然列表控制功能不适用于另一个进程,但GetWindowText 可以。这没有任何意义。
  • @Synetech 是的,你是对的,它令人困惑。如果我找到答案,我会通知你。
  • @Searock,谢谢,但别担心; Raymond Chen answered it.
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多