跨进程SysTreeView32单击子节点无反应【通达信独立交易软件】

绝版PC 2019-02-26 11:30:37
PostMessage("根节点已获取", TVM_SELECTITEM, TVGN_CARET, "子节点以获取");
样式效果出现,根据选中到子节点[蓝色选中项移至对于子节点],但没有触发应有的单击事件

以上方法在部分程序可正常使用...但有些程序没办法正常使用,不清楚是什么原因?没有在这方面遇到坑的大神回复一下呀
...全文
434 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
绝版PC 2019-06-10
  • 打赏
  • 举报
回复
听说通过内存读取操作可用实现。
绝版PC 2019-03-05
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
用spy++看下,有的软件,用vb6写的,使用的是vb自带的mscomctlX.ocx里的treeview,而不是操作系统的comctl32.dll标准接口,没法用api函数操作。

唉,有其它需求了,这个问题先被跳过了,等过两周,不忙时再来填坑【不太考虑再用其它语言,还是尽量用C#,vb不熟~】
绝版PC 2019-03-05
  • 打赏
  • 举报
回复
引用 8 楼 wwwspider001 的回复:
不好意思,搞错了,我之前是list,你的是tree

用下面的消息获取位置,然后鼠标左击试试
Commctrl.h

RECT rc;
*(HTREEITEM*)&rc = hTreeItem;
SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);


唉,有其它需求了,这个问题先被跳过了,等过两周,不忙时再来填坑
threenewbee 2019-03-01
  • 打赏
  • 举报
回复
用spy++看下,有的软件,用vb6写的,使用的是vb自带的mscomctlX.ocx里的treeview,而不是操作系统的comctl32.dll标准接口,没法用api函数操作。
wwwspider001 2019-02-28
  • 打赏
  • 举报
回复
可以做下面测试: 1、用按键上下移动选中项,看看是不是会触发单击事件 2、发送鼠标左击消息试试看
wwwspider001 2019-02-28
  • 打赏
  • 举报
回复
不好意思,搞错了,我之前是list,你的是tree 用下面的消息获取位置,然后鼠标左击试试 Commctrl.h RECT rc; *(HTREEITEM*)&rc = hTreeItem; SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);
wwwspider001 2019-02-28
  • 打赏
  • 举报
回复
还可以试试另外一个消息:LVM_SETITEMSTATE,下面是我之前写的代码,你可以试试看

BOOL __stdcall SysListView32_SelectIndexItem(HWND hWnd, int iIndex)
{
	BOOL bRet = FALSE;
	DWORD dwProcessID;
	DWORD dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessID);
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
	if (hProcess != NULL)
	{
		LPVOID lpRemoteBuffer = VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT,PAGE_READWRITE);
		if (lpRemoteBuffer != NULL)
		{
			LVITEM lvItem;
			lvItem.mask = LVIF_STATE;
			lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
			lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
			if(WriteProcessMemory(hProcess, lpRemoteBuffer, &lvItem, sizeof(LVITEM), NULL))
			{
				bRet = SendMessage(hWnd, LVM_SETITEMSTATE, iIndex, (LPARAM)lpRemoteBuffer);
			}
			VirtualFreeEx(hProcess, lpRemoteBuffer, 0, MEM_RELEASE);
		}
		CloseHandle(hProcess);
	}
	return bRet;
}


int __stdcall SysListView32_FindStringIndex(HWND hWnd, char* pszItem)
{
	int iRet = -1;
	DWORD dwProcessID;
	DWORD dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessID);
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
	if (hProcess != NULL)
	{
		LPVOID lpRemoteBuffer = VirtualAllocEx(hProcess, NULL, sizeof(LVFINDINFO) + 100, MEM_COMMIT,PAGE_READWRITE);
		if (lpRemoteBuffer != NULL)
		{
			LVFINDINFO lvFI;
			lvFI.flags = LVFI_PARTIAL;
			lvFI.psz = (LPCTSTR)lpRemoteBuffer + sizeof(LVFINDINFO);
			
			if(WriteProcessMemory(hProcess, lpRemoteBuffer, &lvFI, sizeof(LVFINDINFO), NULL))
			{
				if(WriteProcessMemory(hProcess, (LPTSTR)lpRemoteBuffer + sizeof(LVFINDINFO), pszItem, strlen(pszItem)+1, NULL))
				{
					iRet = SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)lpRemoteBuffer);
				}
			}
			VirtualFreeEx(hProcess, lpRemoteBuffer, 0, MEM_RELEASE);
		}
		CloseHandle(hProcess);
	}
	return iRet;
}
绝版PC 2019-02-28
  • 打赏
  • 举报
回复
引用 4 楼 wwwspider001 的回复:
可以做下面测试:
1、用按键上下移动选中项,看看是不是会触发单击事件
2、发送鼠标左击消息试试看


我试过一种移动鼠标【绝对坐标/这个坐标是我手动量的,如果能获取也行】按下鼠标左键/松开左键 能触发单击事件。但这种方法很不稳定
https://blog.csdn.net/arebu/article/details/78549339
这个是有些相似,但代码不太完整,我这半吊子有些看不懂
“”如果能获取SysTreeView32的指定节点的绝对坐标也行“”
绝版PC 2019-02-28
  • 打赏
  • 举报
回复
引用 3 楼 千城火 的回复:
是声明,字打错了


跨进程,不是跨线程。
绝版PC 2019-02-27
  • 打赏
  • 举报
回复
...大神有没有~
Chasmれ 2019-02-27
  • 打赏
  • 举报
回复
是声明,字打错了
Chasmれ 2019-02-27
  • 打赏
  • 举报
回复
跨线程调用UI界面需要使用委托,比如我想在线程中传入消息显示在Winform界面上的RichTextBox里,就生命一个委托方法
 delegate void AddMsgDelegate(string msg);
        public void DAddMsg(string msg)
        {
            if (richText_msg.InvokeRequired)
            {
                Invoke(new AddMsgDelegate(DAddMsg), new object[] { msg });
            }
            else
            {
                this.richText_msg.AppendText(msg);
            }
        }
在线程中调用DAddMsg(“123”)方法即可,记得线程的 IsBackground属性 = true;

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧