MFC截图程序的实现(十二)

来源:互联网 发布:外汇交易分析软件 编辑:程序博客网 时间:2024/05/16 10:15

    上篇文章虽然实现了自定义截图的功能,但是设置透明窗口后画的矩形也不清楚了,所以我修改了一下源程序,让弹出的最大化窗口完全透明。这样画出来的矩形就不透明了,但是窗口设为完全透明后就响应不了窗口的鼠标消息了。也就是说,窗口完全透明后就好像这个窗口不存在了,可以透过这个窗口操作其他窗口,这样就无法画矩形了。

    为了解决上述问题,我设置了一个鼠标的钩子函数,当画矩形时,截取系统范围内所有的鼠标消息。这样鼠标的操作就不会转到其他程序上了。

    下面是关键代码:

CoverDlg.cpp

// CoverDlg.cpp : implementation file//#include "stdafx.h"#include "Custom_CutScreen.h"#include "CoverDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//// 定义全局变量和全局函数//POINT startPoint;  // 画矩形的左上角坐标POINT endPoint;    // 画矩形的右下角坐标bool IsLBtnUp;     // 鼠标左键是否弹起bool IsRBtnUp;     // 鼠标右键是否弹起bool IsLBtnDown;   // 鼠标左键是否按下#define WH_MOUSE_LL        14HHOOK hhookMs = NULL;  LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam);  BOOL UninstallKbHook();  BOOL InstallKbHook();  DWORD clickInterval = 0;/////////////////////////////////////////////////////////////////////////////// CCoverDlg dialogCCoverDlg::CCoverDlg(CWnd* pParent /*=NULL*/): CDialog(CCoverDlg::IDD, pParent){//{{AFX_DATA_INIT(CCoverDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT}void CCoverDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCoverDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCoverDlg, CDialog)//{{AFX_MSG_MAP(CCoverDlg)ON_WM_PAINT()ON_WM_MOUSEMOVE()ON_WM_TIMER()ON_WM_CLOSE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCoverDlg message handlersvoid CCoverDlg::OnPaint() {CPaintDC dc(this); // device context for painting// TODO: Add your message handler code here//绘制背景  CRect rect;  GetClientRect(&rect);  CBrush bruDB(GetSysColor(COLOR_3DFACE));//背景颜色  dc.FillRect(&rect, &bruDB); //绘制拖动矩形  if (IsLBtnDown)  {  CPen pen(PS_SOLID,6,RGB(234,23,53));CPen *pOldPen=dc.SelectObject(&pen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(startPoint, endPoint));dc.SelectObject(pOldPen);dc.SelectObject(pOldBrush);}// Do not call CDialog::OnPaint() for painting messages}/************************************************************************//* 鼠标左键按下的响应函数                                               *//************************************************************************///DEL void CCoverDlg::OnLButtonDown(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL startPoint = point;//DEL endPoint = point;//DEL IsLBtnDown = true;//DEL //DEL CDialog::OnLButtonDown(nFlags, point);//DEL }/************************************************************************//* 鼠标左键弹起的响应函数                                               *//************************************************************************///DEL void CCoverDlg::OnLButtonUp(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL endPoint = point;//DEL IsLBtnDown = false;//DEL IsLBtnUp = true;//DEL //DEL CDialog::OnLButtonUp(nFlags, point);//DEL }/************************************************************************//* 鼠标移动的响应函数                                                   *//************************************************************************/void CCoverDlg::OnMouseMove(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultendPoint = point;CDialog::OnMouseMove(nFlags, point);}/************************************************************************//* 计时器函数                                                           *//************************************************************************/void CCoverDlg::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultif (nIDEvent == 1){// 如果鼠标左键弹起,则关闭对话框if (IsLBtnUp) {SendMessage(WM_CLOSE);KillTimer(1);}// 如果鼠标右键弹起(用户取消了截图),关闭对话框if (IsRBtnUp) {SendMessage(WM_CLOSE);KillTimer(1);}Invalidate(FALSE);//更新界面  }CDialog::OnTimer(nIDEvent);}/************************************************************************//* 对话框的初始化函数                                                   *//************************************************************************/BOOL CCoverDlg::OnInitDialog() {CDialog::OnInitDialog();// TODO: Add extra initialization here// 变量初始化IsLBtnUp = false;IsLBtnDown = false;IsRBtnUp = false;ShowWindow(SW_MAXIMIZE);  // 窗口最大化SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); // 窗口置顶// 设置窗体透明COLORREF maskColor = GetSysColor(COLOR_3DFACE); // 获取窗体颜色SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x00080000);  HINSTANCE hInst = LoadLibrary(_T("User32.dll"));    if (hInst)      {         typedef BOOL (WINAPI *MyFun)(HWND,COLORREF,BYTE,DWORD);          MyFun myfun = NULL;        myfun = (MyFun)GetProcAddress(hInst, "SetLayeredWindowAttributes");         if (myfun) myfun(GetSafeHwnd(),maskColor,100,1);  // 100是透明度(范围0-255)      FreeLibrary(hInst);      }  // 设置计时器SetTimer(1, 100, NULL);// 启动钩子InstallKbHook();return TRUE;  // return TRUE unless you set the focus to a control              // EXCEPTION: OCX Property Pages should return FALSE}/************************************************************************//* 鼠标右键弹起的响应函数                                               *//************************************************************************///DEL void CCoverDlg::OnRButtonUp(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL IsRBtnUp = true;//DEL //DEL CDialog::OnRButtonUp(nFlags, point);//DEL }POINT CCoverDlg::GetStartPoint(){return startPoint;}POINT CCoverDlg::GetEndPoint(){return endPoint;}bool CCoverDlg::GetWhetherCancel(){return IsRBtnUp;}/************************************************************************//* 鼠标钩子回调函数                                                     *//************************************************************************/LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam)  {  switch (nCode)  {  case HC_ACTION:  {  //鼠标移动  if (wParam == WM_MOUSEMOVE)   {  // 保存鼠标起始位置CPoint pt;GetCursorPos(&pt);endPoint = pt;}  // 鼠标左键按下if (wParam == WM_LBUTTONDOWN){// 保存鼠标起始位置CPoint pt;GetCursorPos(&pt);startPoint = pt;endPoint = pt;IsLBtnDown = true;return TRUE;}// 鼠标左键弹起  if(wParam == WM_LBUTTONUP)  {    // 保存鼠标结束位置CPoint pt;GetCursorPos(&pt);endPoint = pt;IsLBtnUp = true;return TRUE; // 返回TRUE,终止该消息}  // 鼠标右键按下if(wParam == WM_RBUTTONDOWN) {return TRUE; // 返回TRUE,终止该消息} // 鼠标右键弹起if (wParam == WM_RBUTTONUP) {IsRBtnUp = true;return TRUE;}} break;default:  break;  }  return CallNextHookEx (NULL, nCode, wParam, lParam);  }  BOOL InstallKbHook( )  {  if (hhookMs)  UninstallKbHook();  hhookMs = SetWindowsHookEx(WH_MOUSE_LL,   (HOOKPROC)LowLevelMouseProc, AfxGetApp()->m_hInstance, NULL);  return(hhookMs != NULL);  }  BOOL UninstallKbHook()  {  BOOL fOk = FALSE;  if (hhookMs) {  fOk = UnhookWindowsHookEx(hhookMs);  hhookMs = NULL;  }  return(fOk);  }  void CCoverDlg::OnClose() {// TODO: Add your message handler code here and/or call default// 卸载钩子UninstallKbHook();CDialog::OnClose();}


完整源代码:http://download.csdn.net/detail/wwkaven/7502719




0 0