// WeChatsDlg.cpp : 实现文件 // #include "stdafx.h" #include "WeChats.h" #include "WeChatsDlg.h" #include "CWxObject.h" #include "WxMgr.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CWeChatsDlg 对话框 HWND g_hWxWnd = NULL; CWeChatsDlg::CWeChatsDlg(CWnd* pParent /*=NULL*/) : CDialog(CWeChatsDlg::IDD, pParent) { m_bMouseDown = FALSE; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CWeChatsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CWeChatsDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(BTN_OPEN_WX, &CWeChatsDlg::OnBnClickedOpenWx) ON_WM_CTLCOLOR() ON_BN_CLICKED(BTN_ATTACH_WX, &CWeChatsDlg::OnBnClickedAttachWx) ON_COMMAND_RANGE(10000, 10010, OnBtnClickedWxName) ON_BN_CLICKED(IDC_BUTTON2, &CWeChatsDlg::OnBnClickedButton2) END_MESSAGE_MAP() // CWeChatsDlg 消息处理程序 BOOL CWeChatsDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 CRect rcWxList, rcWxShow; GetDlgItem(RECT_WXLIST)->GetWindowRect(&rcWxList); GetDlgItem(RECT_WECHAT)->GetWindowRect(&rcWxShow); ScreenToClient(&rcWxList); ScreenToClient(&rcWxShow); m_wxMgr.SetMainWnd(this, rcWxList, rcWxShow); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CWeChatsDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CWeChatsDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CWeChatsDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CWeChatsDlg::OnBnClickedOpenWx() { // TODO: 在此添加控件通知处理程序代码 m_wxMgr.OpenWeChat(); } void CWeChatsDlg::OnBnClickedAttachWx() { // TODO: 在此添加控件通知处理程序代码 #if 0 CCurlClient curl; if (curl.Initialize() == CURLE_OK) { std::string strData; if (curl.Get(_T("http://wx.qlogo.cn/mmhead/ver_1/Tz5FIs4ruHxibTr3Ejj0FGS7MFZzic2lUpwJPUWRBeZMjHnusJU7G33cCmK0T6eqlajSlJSmdicgpMvTQdQ7NumIOrkw1KxibgmuQibzPrTOQy30/132"), strData) == CURLE_OK) { FILE* pf = NULL; TCHAR szWxImage[MAX_PATH] = { 0 }; _stprintf_s(szWxImage, _T("%s%s\\%s.jpg"), g_szModulePath, _T("image"), _T("wxid_uvndopqn7h2222")); pf = _tfopen(szWxImage, _T("wb+")); if (pf) { fwrite(strData.data(), strData.size(), 1, pf); fclose(pf); } } } #endif m_wxMgr.AttachUnMgrWxProc(GetDlgItem(WX_RECT)); if ( m_wxMgr.GetAttachCount() ) { CButtonST *pButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[10000]); CStatic *pWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[10000]); CWxObject *pWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[10000]); if (pButton) { pButton->SetCheck(TRUE); pWxChatWnd->ShowWindow(SW_SHOW); } } } void CWeChatsDlg::OnBtnClickedWxName(UINT uID) { static UINT lastID = 10000; if ( m_wxMgr.m_mapIds[uID] == 0 ) { #ifdef DEBUG OutputDebugString(_T("对应按钮的微信ID空\n")); #endif // DEBUG return; } if ( lastID == uID) { return; } // 单击了则显示当前微信窗口,隐藏上一个; CButtonST *plastButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[lastID]); CStatic *plastWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[lastID]); CWxObject *plastWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[lastID]); //plastButton->EnableWindow(TRUE); plastButton->SetCheck(TRUE); plastWxChatWnd->ShowWindow(SW_HIDE); CButtonST *pButton = m_wxMgr.GetButton(m_wxMgr.m_mapIds[uID]); CStatic *pWxChatWnd = m_wxMgr.GetWxChatWnd(m_wxMgr.m_mapIds[uID]); CWxObject *pWxObject = m_wxMgr.GetWxObject(m_wxMgr.m_mapIds[uID]); if (pButton->GetCheck() == FALSE) { pButton->SetCheck(TRUE); pWxChatWnd->ShowWindow(SW_SHOW); //pButton->EnableWindow(FALSE); lastID = uID; } } HBRUSH CWeChatsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 pDC->SetBkMode(TRANSPARENT); // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; } BOOL CWeChatsDlg::DestroyWindow() { // TODO: 在此添加专用代码和/或调用基类 m_wxMgr.DetachAllWxProc(); return CDialog::DestroyWindow(); } BOOL CWeChatsDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg->hwnd == m_hWnd) { if (pMsg->message == WM_NCLBUTTONDOWN) {// 非客户区左键按下; m_bMouseDown = TRUE; } if (pMsg->message == WM_NCLBUTTONUP) {// 非客户区左键放开; m_bMouseDown = FALSE; } if (pMsg->message == WM_NCMOUSEMOVE) {// 非客户区鼠标移动; if (m_bMouseDown && m_wxObj.m_hWxMainWnd) { //::PostMessage(m_wxObj.m_hWxMainWnd,WM_SYSCOMMAND, SC_MAXIMIZE, NULL); } } } return CDialog::PreTranslateMessage(pMsg); } void CWeChatsDlg::OnBnClickedButton2() { #if 0// 方法一; // 设置鼠标位置; SetCursorPos(850, 850); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); #endif #if 1 // 方法二;(坐标系为桌面,要计算窗口的位置;) CPoint pt(850, 850); //换算到event点 int mx = pt.x * 65535 / GetSystemMetrics(SM_CXSCREEN); int my = pt.y * 65535 / GetSystemMetrics(SM_CYSCREEN); // 移动到指定位置; mouse_event(MOUSEEVENTF_MOVE| MOUSEEVENTF_ABSOLUTE, mx, my, 0,0); // 再单击; mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); #endif // 按下Ctrl+V; keybd_event(17, 0, 0, 0); // 按下CTRL keybd_event(86, 0, 0, 0); // 按下V keybd_event(86, 0, KEYEVENTF_KEYUP, 0);// 松开V; keybd_event(17, 0, KEYEVENTF_KEYUP, 0);// 松开CTRL; }