|

楼主 |
发表于 2019-11-7 10:40:38
|
显示全部楼层
//定义响应鼠标按下的消息
void CWindowsHwndDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HICON hcursor = LoadCursor(NULL,IDC_ARROW);//AfxGetApp()->LoadCursorW->(IDC_ARROW)这里我并没有按照 作者的写法。因为这只是加载一个光标,我改成了自己的写法
//该函数返回加载成功的光标句柄
SetCursor(hcursor);//setcursor函数是用来确定一个光标,该参数是确定光标的句柄
SetCapture();//函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,
//所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。
CDialogEx::OnLButtonDown(nFlags, point);
}
HWND m_ghwnd;//定义一个全局的句柄
RECT m_rectwnd;//定义一个矩形在后面绘图将会用到
void CWindowsHwndDlg::OnLButtonUp(UINT nFlags, CPoint point)//定义鼠标弹起函数
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ReleaseCapture();
//释放鼠标 该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。
//因为我们在鼠标按下的消息哪里不活了鼠标消息,那么我们在这里要释放 因为我们这里是鼠标弹起
POINT pt;//定义一个point的结构体成员,该成员保存着该结构体的信息
GetCursorPos(&pt);//琥珀去当前鼠标的坐标,以屏幕坐标为表示该参数需要一个指向point结构的成员,用来保存该鼠标的消息
m_ghwnd=::WindowFromPoint(pt);//获取指定点的窗口句柄参数pt是指向piont结构的成员,该成员保存了当前鼠标的消息 ,在鼠标消息在getcursorpos中赋给了pt按地址传递进去得 深层复制
//WindowFromPoint是一个计算机函数,功能是获得包含指定点的窗口的句柄,函数原型是HWND WindowFromPoint。
///////画矩形方框
if (m_ghwnd == m_hWnd || ::GetParent(m_ghwnd) == m_ghwnd)//判断当前的句柄是都等于主窗口句柄
//getparent()pe冷次 获取一个指定子窗口的父句柄---GetParent函数获得一个指定子窗口的父窗口句柄。
return;
::GetWindowRect(m_ghwnd, &m_rectwnd);
if (m_rectwnd.left < 0)
m_rectwnd.left = 0;
if (m_rectwnd.top < 0)
m_rectwnd.top = 0;
CBrush brush;
brush.CreateSolidBrush(RGB(255, 0, 0));
HDC phdc = CreateDC(L"display", NULL, NULL, NULL);
FrameRect(phdc, &m_rectwnd,(HBRUSH)brush.m_hObject);
brush.DeleteObject();
DeleteDC(phdc);
CString str;
str.Format(L"%d", m_ghwnd);
GetDlgItem(IDC_EDIT_Hwnd)->SetWindowTextW(str);
TCHAR ct[200]=L"\0";
::GetWindowText(m_ghwnd,ct,200);
SetDlgItemText(IDC_EDIT_TXT, ct);
//获取类名
TCHAR cy[200] = L"\0";
GetClassName(m_ghwnd, cy, 200);
SetDlgItemText(IDC_EDIT_Class, cy);
CDialogEx::OnLButtonUp(nFlags, point);
}
void CWindowsHwndDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szCommand[MAX_PATH];
// 设置一个进程的优先级表,参数是进程的句柄,和指定优先级的参数
//进程句柄可以调用getcurrentprocess函数获取该函数没有参数,并且返回当前进程的伪句柄
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
//返回伪句柄
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
//返回伪句柄
wsprintf(szCommand, L"/c del /q %s", _wpgmptr);//_wpgmptr-----GetModuleFileName(NULL,NULL,NULL)
//这两个函数用途是一样的获取当前进程已加载的模块路径
// /c是close关闭的缩写,del是删除指定的文件 Drive path File Name缩写
//path是路径,
//将字符串和数字输入到缓冲区 也就是将后面的DOS命令输入到前面的szcommand缓冲区中
//L"/c del /q %s" Dos命令,del是删除,/q是不弹出去人对话框以安静的方式卸载
//将DOS命令格式化进命令行szcommand,
ShellExecute(m_hWnd,L"open", L"cmd.exe", szCommand, NULL, SW_HIDE);//卸载模式 也可以写成隐藏sw_hide
ExitProcess(0);//退出当前线程
}
|
|