CListCtrl控件上模拟右键单击事件无法得到正确结果,求解!

a7624869 2015-04-11 02:13:33
用FindWindow找到任务管理器的进程列表(CListCtrl控件),对列表中的第一行发送右键单击事件成功了,但是却没有出现右键的菜单,



// op_caidao.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "op_caidao.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;


BOOL CALLBACK EnumChildProc(
HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
WCHAR wszClassName[MAX_PATH] = {0};
GetClassNameW(hwnd, wszClassName, MAX_PATH);
wstring wsClassName = wszClassName;
if ( _T("SysListView32") == wsClassName )
{
SetForegroundWindow(hwnd);



DWORD PID = 0;
::GetWindowThreadProcessId(hwnd, &PID);
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if(hProcess)
{
RECT rc = {0};
RECT* pRect = NULL;
pRect = (RECT*)::VirtualAllocEx(hProcess, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
if(NULL == pRect)
{
::CloseHandle(hProcess);
return FALSE;
}
// 这里得到CListCtrl控件的item = 2的RECT区域,即CListCtrl控件的第三行
::SendMessage(hwnd, LVM_GETITEMRECT, 2, (LPARAM)pRect);
DWORD dwRead = 0;
::ReadProcessMemory(hProcess, pRect, &rc, sizeof(RECT), &dwRead);
POINT pt = {0};
pt.x = rc.left + (rc.right - rc.left) / 2;
pt.y = rc.top + (rc.bottom - rc.top) / 2;
::SendMessage(hwnd, WM_LBUTTONDBLCLK, MK_LBUTTON, (LPARAM)&MAKEPOINTS(pt.x, pt.y));
::VirtualFreeEx(hProcess, pRect, sizeof(RECT), MEM_RELEASE);
::CloseHandle(hProcess);
}


return FALSE;
}

return TRUE;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

HMODULE hModule = ::GetModuleHandle(NULL);

if (hModule != NULL)
{
// initialize MFC and print and error on failure
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.

HWND hCaiDao = FindWindow(_T("#32770"), _T("Windows 任务管理器"));
if ( hCaiDao )
{
EnumChildWindows(hCaiDao, EnumChildProc, NULL);
}
}
}
else
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
nRetCode = 1;
}

return nRetCode;
}
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-05-12
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
lx624909677 2015-04-12
  • 打赏
  • 举报
回复
右键单击过会让那个高亮的条不是高亮并且只留虚线条吗?或者你试试HOOK来做
a7624869 2015-04-11
  • 打赏
  • 举报
回复
引用 3 楼 lx624909677 的回复:
你怎么知道你的程序一定执行了右键按键的动作?
我先打开任务管理器,选中某一条 当我的程序跑完之后,本来选中的那一条变成没有选中的状态。 就是说之前选中的条目的蓝色高亮部分没有了,但是条目边边上的虚线还在,这足以证明,确实有执行过右键单击。 所以我也很奇怪, 能否解决这疑惑呢?
lx624909677 2015-04-11
  • 打赏
  • 举报
回复
你怎么知道你的程序一定执行了右键按键的动作?
a7624869 2015-04-11
  • 打赏
  • 举报
回复
引用 1 楼 lx624909677 的回复:
FindWindow不能找子窗口,CListCtrl属于子窗口了,用FindWindowEx来获得子窗口句柄


找子窗口我用EnumChildWindow了。 现在的问题不是说找不找得到子窗口

本来我想对任务管理器里面的进程管理(CListCtrl)里面,右键单击某一个进程(CListCtrl 中的某一个条目),然后弹出右键菜单,然后选择结束进程;

现在的问题是,它确实有在 进程管理(CListCtrl)的某一进程中按下右键了,但是 并没有选中某一条进程按,所以没有弹出结束进程的菜单


我期望的最终结果如下图:
lx624909677 2015-04-11
  • 打赏
  • 举报
回复
FindWindow不能找子窗口,CListCtrl属于子窗口了,用FindWindowEx来获得子窗口句柄

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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