lyfzServerDlg.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. // lyfzServerDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "lyfzServer.h"
  5. #include "lyfzServerDlg.h"
  6. #include "afxdialogex.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. #if USE_TRAYICON
  11. #define WM_MY_TRAY_NOTIFICATION WM_USER + 109
  12. const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("lyfzServer"));
  13. #endif
  14. //增加自动启动注册表项
  15. INT AddAutoSysRun(LPBYTE lpExeFile, CONST DWORD &cbExeFile, LPCTSTR lpKeyName, INT iAutoRunSystem)
  16. {
  17. HKEY hKey = NULL;
  18. DWORD dwErrorCode = 0;
  19. //创建注册表,有该键则读取,无则创建
  20. dwErrorCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  21. _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
  22. 0,
  23. NULL,
  24. REG_OPTION_NON_VOLATILE,
  25. KEY_ALL_ACCESS, //
  26. //KEY_READ,
  27. NULL, //Security
  28. &hKey,
  29. NULL);
  30. if (dwErrorCode == ERROR_SUCCESS)
  31. {
  32. if (iAutoRunSystem)
  33. {
  34. dwErrorCode = RegSetValueEx(hKey, lpKeyName, NULL, REG_SZ, lpExeFile, cbExeFile);
  35. }
  36. else
  37. {
  38. dwErrorCode = RegDeleteValue(hKey, lpKeyName);
  39. dwErrorCode = RegDeleteKey(hKey, lpKeyName);
  40. }
  41. }
  42. if (NULL != hKey)
  43. RegCloseKey(hKey);
  44. hKey = NULL;
  45. return 0;
  46. }
  47. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  48. class CAboutDlg : public CDialogEx
  49. {
  50. public:
  51. CAboutDlg();
  52. // 对话框数据
  53. enum { IDD = IDD_ABOUTBOX };
  54. protected:
  55. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  56. // 实现
  57. protected:
  58. DECLARE_MESSAGE_MAP()
  59. };
  60. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  61. {
  62. }
  63. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CDialogEx::DoDataExchange(pDX);
  66. }
  67. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  68. END_MESSAGE_MAP()
  69. // ClyfzServerDlg 对话框
  70. #if USE_TRAYICON
  71. ClyfzServerDlg::ClyfzServerDlg(CWnd* pParent /*=NULL*/)
  72. : CDialogEx(ClyfzServerDlg::IDD, pParent), m_trayIcon(IDR_MAINFRAME)
  73. #else
  74. ClyfzServerDlg::ClyfzServerDlg(CWnd* pParent /*=NULL*/)
  75. : CDialogEx(ClyfzServerDlg::IDD, pParent)
  76. #endif
  77. {
  78. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  79. #if USE_TRAYICON
  80. m_isNotify = TRUE;
  81. m_bNoticeTray = FALSE;
  82. #endif
  83. }
  84. void ClyfzServerDlg::DoDataExchange(CDataExchange* pDX)
  85. {
  86. CDialogEx::DoDataExchange(pDX);
  87. }
  88. BEGIN_MESSAGE_MAP(ClyfzServerDlg, CDialogEx)
  89. ON_WM_SYSCOMMAND()
  90. ON_WM_PAINT()
  91. ON_WM_QUERYDRAGICON()
  92. #if USE_TRAYICON
  93. ON_MESSAGE(WM_MY_TRAY_NOTIFICATION, OnTrayNotification)
  94. ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated)
  95. #endif
  96. ON_COMMAND(Menu_Exit, &ClyfzServerDlg::OnExit)
  97. ON_BN_CLICKED(IDOK, &ClyfzServerDlg::OnBnClickedOk)
  98. ON_BN_CLICKED(IDCANCEL, &ClyfzServerDlg::OnBnClickedCancel)
  99. ON_WM_TIMER()
  100. END_MESSAGE_MAP()
  101. // ClyfzServerDlg 消息处理程序
  102. BOOL ClyfzServerDlg::OnInitDialog()
  103. {
  104. CDialogEx::OnInitDialog();
  105. // 将“关于...”菜单项添加到系统菜单中。
  106. // IDM_ABOUTBOX 必须在系统命令范围内。
  107. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  108. ASSERT(IDM_ABOUTBOX < 0xF000);
  109. CMenu* pSysMenu = GetSystemMenu(FALSE);
  110. if (pSysMenu != NULL)
  111. {
  112. BOOL bNameValid;
  113. CString strAboutMenu;
  114. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  115. ASSERT(bNameValid);
  116. if (!strAboutMenu.IsEmpty())
  117. {
  118. pSysMenu->AppendMenu(MF_SEPARATOR);
  119. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  120. }
  121. }
  122. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  123. // 执行此操作
  124. SetIcon(m_hIcon, TRUE); // 设置大图标
  125. SetIcon(m_hIcon, FALSE); // 设置小图标
  126. #if USE_TRAYICON
  127. InitTrayIcon();
  128. #endif
  129. // TODO: 在此添加额外的初始化代码
  130. SetTimer(0, 10, NULL);
  131. // 启动项;
  132. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  133. TCHAR szDir[_MAX_DIR] = { 0 };
  134. TCHAR szFName[_MAX_FNAME] = { 0 };
  135. TCHAR szExt[_MAX_EXT] = { 0 };
  136. TCHAR szModulePath[_MAX_DRIVE] = { 0 };
  137. ::GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
  138. _tsplitpath_s(szModulePath, szDrive, szDir, szFName, szExt);
  139. _tcscpy_s(szModulePath, szDrive);
  140. _tcscat_s(szModulePath, szDir);
  141. AfxGetApp()->WriteProfileInt(szFName, _T("Autoruning"), TRUE);
  142. AddAutoSysRun((LPBYTE)szFName, _tcslen(szFName)*sizeof(TCHAR), szFName, TRUE);
  143. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  144. }
  145. #if USE_TRAYICON
  146. void ClyfzServerDlg::InitTrayIcon()
  147. {
  148. m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
  149. m_trayIcon.SetIcon(IDR_MAINFRAME, _T("选片服务"));
  150. m_trayIcon.SetDefaultTip(_T("选片服务"));
  151. }
  152. LRESULT ClyfzServerDlg::OnTaskBarCreated(WPARAM wp, LPARAM lp)
  153. {
  154. Shell_NotifyIcon(NIM_ADD, &m_trayIcon.m_nid);
  155. return 0;
  156. }
  157. // Handle notification from tray icon: display a message.
  158. LRESULT ClyfzServerDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
  159. {
  160. if (m_isNotify)
  161. {
  162. static LPCSTR MouseMessages[] = { "WM_MOUSEMOVE",
  163. "WM_LBUTTONDOWN", "WM_LBUTTONUP", "WM_LBUTTONDBLCLK",
  164. "WM_RBUTTONDOWN", "WM_RBUTTONUP", "WM_RBUTTONDBLCLK",
  165. "WM_MBUTTONDOWN", "WM_MBUTTONUP", "WM_MBUTTONDBLCLK" };
  166. }
  167. if (uID != IDR_MAINFRAME)
  168. return m_trayIcon.OnTrayNotification(uID, lEvent);
  169. switch (lEvent)
  170. {
  171. case WM_RBUTTONUP:
  172. TrayRight();
  173. break;
  174. case WM_LBUTTONUP:
  175. break;
  176. case WM_LBUTTONDBLCLK:
  177. TaskNotifyIcon();
  178. break;
  179. default:
  180. break;
  181. }
  182. return 0;
  183. }
  184. void ClyfzServerDlg::TrayRight()
  185. {
  186. CMenu menu;
  187. if (!menu.LoadMenu(IDR_MENU1))
  188. return;
  189. CMenu* pSubMenu = menu.GetSubMenu(0);
  190. if (!pSubMenu)
  191. return;
  192. // 获取任务栏高度;
  193. RECT rc;
  194. INT iHeight;
  195. HWND hWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
  196. if (hWnd)
  197. {
  198. ::GetWindowRect(hWnd, &rc);
  199. iHeight = rc.bottom - rc.top;
  200. }
  201. pSubMenu->CheckMenuItem(Menu_Exit, MF_BYCOMMAND | MF_UNCHECKED);
  202. CPoint point;
  203. GetCursorPos(&point);
  204. point.y = rc.top - 1;
  205. ::SetForegroundWindow(m_hWnd);
  206. pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x - 100, point.y, this);
  207. }
  208. void ClyfzServerDlg::TaskNotifyIcon()
  209. {
  210. if (!m_bNoticeTray)
  211. {
  212. m_trayIcon.SetIcon(IDR_MAINFRAME, _T("选片服务程序"));
  213. ShowWindow(SW_SHOW);
  214. m_bNoticeTray = TRUE;
  215. }
  216. else
  217. {
  218. m_trayIcon.SetIcon(IDR_MAINFRAME, _T("选片服务程序"));
  219. ShowWindow(SW_HIDE);
  220. m_bNoticeTray = FALSE;
  221. }
  222. }
  223. #endif
  224. void ClyfzServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  225. {
  226. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  227. {
  228. CAboutDlg dlgAbout;
  229. dlgAbout.DoModal();
  230. }
  231. else
  232. {
  233. CDialogEx::OnSysCommand(nID, lParam);
  234. }
  235. }
  236. // 如果向对话框添加最小化按钮,则需要下面的代码
  237. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  238. // 这将由框架自动完成。
  239. void ClyfzServerDlg::OnPaint()
  240. {
  241. if (IsIconic())
  242. {
  243. CPaintDC dc(this); // 用于绘制的设备上下文
  244. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  245. // 使图标在工作区矩形中居中
  246. int cxIcon = GetSystemMetrics(SM_CXICON);
  247. int cyIcon = GetSystemMetrics(SM_CYICON);
  248. CRect rect;
  249. GetClientRect(&rect);
  250. int x = (rect.Width() - cxIcon + 1) / 2;
  251. int y = (rect.Height() - cyIcon + 1) / 2;
  252. // 绘制图标
  253. dc.DrawIcon(x, y, m_hIcon);
  254. }
  255. else
  256. {
  257. CDialogEx::OnPaint();
  258. }
  259. }
  260. //当用户拖动最小化窗口时系统调用此函数取得光标
  261. //显示。
  262. HCURSOR ClyfzServerDlg::OnQueryDragIcon()
  263. {
  264. return static_cast<HCURSOR>(m_hIcon);
  265. }
  266. void ClyfzServerDlg::OnExit()
  267. {
  268. CDialogEx::OnCancel();
  269. }
  270. void ClyfzServerDlg::OnBnClickedOk()
  271. {
  272. // TODO: 在此添加控件通知处理程序代码
  273. ShowWindow(SW_HIDE);
  274. m_bNoticeTray = FALSE;
  275. }
  276. void ClyfzServerDlg::OnBnClickedCancel()
  277. {
  278. // TODO: 在此添加控件通知处理程序代码
  279. ShowWindow(SW_HIDE);
  280. m_bNoticeTray = FALSE;
  281. }
  282. void ClyfzServerDlg::OnTimer(UINT_PTR nIDEvent)
  283. {
  284. // TODO: 在此添加消息处理程序代码和/或调用默认值
  285. if ( nIDEvent == 0 )
  286. {
  287. KillTimer(nIDEvent);
  288. ShowWindow(SW_HIDE);
  289. m_bNoticeTray = FALSE;
  290. }
  291. CDialogEx::OnTimer(nIDEvent);
  292. }