WNDLIST.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // WndList.cpp : Implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. /*****************************************************************************
  13.   Purpose:
  14. Implements CWndListDlg, the main dialog window for the application.
  15.   Functions:
  16. CWndListDlg::CWndListDlg()          -- constructor
  17. CWndListDlg::Create()               -- create dialog window
  18. CWndListDlg::DoDataExchange()       -- dialog data exchange/validation
  19. CWndListDlg::OnClose()              -- WM_CLOSE handler
  20. CWndListDlg::OnInitDialog()         -- initialize dialog
  21. CWndListDlg::OnOptionNow()          -- handle "Options!Update Now"
  22. CWndListDlg::OnOptionRate()         -- handle "Options!Update Interval"
  23. CWndListDlg::OnSelChangeWndList()   -- update dlg on list selection change
  24. CWndListDlg::OnTimer()              -- WM_TIMER handler
  25. CWndListDlg::OnUpdateOptionRate()   -- set "Options!Update Interval" status
  26. CWndListDlg::OnUpdateTime()         -- update status bar clock
  27. CWndListDlg::WalkWindowList()       -- enumerate windows
  28.   Development Team:
  29. Mary Kirtland
  30.   Ported to 32-bit by:
  31. Mike Hedley
  32.   Created by Microsoft Product Support Services, Premier ISV Support
  33.   Copyright (c) 1998 Microsoft Corporation. All rights reserved.
  34. ****************************************************************************/
  35. #include "stdafx.h"
  36. #include <afxpriv.h>
  37. #include "resource.h"
  38. #include "wndlist.h"
  39. #include "ratedlg.h"
  40. #ifdef _DEBUG
  41. #define new DEBUG_NEW
  42. #undef THIS_FILE
  43. static char THIS_FILE[] = __FILE__;
  44. #endif
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CWndListDlg control bar data
  47. static UINT auIDStatusBar[] = {
  48.    ID_SEPARATOR,
  49.    ID_INDICATOR_TIME
  50. };
  51. static UINT auIDToolBar[] = {
  52.    ID_APP_EXIT,
  53.    ID_SEPARATOR,
  54.    ID_OPTION_NOW,
  55.    ID_OPTION_RATE,
  56.    ID_SEPARATOR,
  57.    ID_HELP_ABOUT
  58. };
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CWndListDlg dialog
  61. CWndListDlg::CWndListDlg()
  62. {
  63. //{{AFX_DATA_INIT(CWndListDlg)
  64. //}}AFX_DATA_INIT
  65. m_nIDTimer = 0;
  66. m_iRate = m_iTicks = 0;
  67. }
  68. BOOL CWndListDlg::Create()
  69. {
  70. return CModelessMain::Create(CWndListDlg::IDD,
  71.  auIDStatusBar,
  72.  sizeof(auIDStatusBar)/sizeof(UINT),
  73.  auIDToolBar,
  74.  sizeof(auIDToolBar)/sizeof(UINT),
  75.  IDR_MAIN);
  76. }
  77. void CWndListDlg::DoDataExchange(CDataExchange* pDX)
  78. {
  79. CModelessMain::DoDataExchange(pDX);
  80. //{{AFX_DATA_MAP(CWndListDlg)
  81. DDX_Control(pDX, IDC_WNDLIST, m_lbWindows);
  82. //}}AFX_DATA_MAP
  83. }
  84. BEGIN_MESSAGE_MAP(CWndListDlg, CModelessMain)
  85. //{{AFX_MSG_MAP(CWndListDlg)
  86. ON_WM_CLOSE()
  87. ON_WM_TIMER()
  88. ON_LBN_SELCHANGE(IDC_WNDLIST, OnSelChangeWndList)
  89. ON_COMMAND(ID_OPTION_NOW, OnOptionNow)
  90. ON_COMMAND(ID_OPTION_RATE, OnOptionRate)
  91. ON_UPDATE_COMMAND_UI(ID_OPTION_RATE, OnUpdateOptionRate)
  92. //}}AFX_MSG_MAP
  93. ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime)
  94. END_MESSAGE_MAP()
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CWndListDlg::OnInitDialog
  97. //      OnInitDialog fills the listbox with information about the parent
  98. //      windows which exist.  It also sets up a 1sec timer, which is used
  99. //      to automatically update the listbox contents and/or to update the
  100. //      status bar clock.
  101. BOOL CWndListDlg::OnInitDialog()
  102. {
  103. CModelessMain::OnInitDialog();
  104. // Initialize windows listbox contents
  105. WalkWindowList();
  106. OnSelChangeWndList();
  107. // Set up a 1 second timer
  108. m_nIDTimer = SetTimer(1, 1000, NULL);
  109. if (!m_nIDTimer)
  110. AfxMessageBox(IDP_NOTIMER);
  111. return TRUE;
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CWndListDlg::OnClose
  115. //      OnClose makes sure the 1sec timer is destroyed when the dialog
  116. //      is closed.
  117. void CWndListDlg::OnClose()
  118. {
  119. if (m_nIDTimer)
  120. {
  121. KillTimer(m_nIDTimer);
  122. m_nIDTimer = NULL;
  123. }
  124. CModelessMain::OnClose();
  125. }
  126. /////////////////////////////////////////////////////////////////////////////
  127. // CWndListDlg::WalkWindowList
  128. //      WalkWindowList enumerates all parent windows on the screen.
  129. //      It adds a string containing the window handle and caption to
  130. //      the listbox for each window, using the helper function
  131. //      EnumWindowsProc().
  132. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
  133. {
  134. static char szBuffer[90];
  135. static char szTemp[80];
  136. static char szFormat[] = _T("%08lX: %s");
  137. HWND hwndListBox = (HWND)lParam;
  138. CListBox* plb = (CListBox*)CWnd::FromHandle(hwndListBox);
  139. GetWindowText(hwnd, szTemp, sizeof(szTemp));
  140. sprintf(szBuffer, szFormat, hwnd, szTemp);
  141. return (plb->AddString(szBuffer) >= 0) ? TRUE : FALSE;
  142. }
  143. void CWndListDlg::WalkWindowList()
  144. {
  145. // don't assume that m_lbWindows has been initialized yet
  146. CListBox* plb = (CListBox*)GetDlgItem(IDC_WNDLIST);
  147. plb->SetRedraw(FALSE);
  148. plb->ResetContent();
  149. EnumWindows(EnumWindowsProc, (LPARAM)plb->GetSafeHwnd());
  150. plb->SetRedraw(TRUE);
  151. }
  152. /////////////////////////////////////////////////////////////////////////////
  153. // CWndListDlg::OnSelChangeWndList
  154. //      OnSelChangeWndList updates the static dialog fields when the
  155. //      window listbox selection is changed.
  156. void CWndListDlg::OnSelChangeWndList()
  157. {
  158. static char szBuffer[256];
  159. static char szTemp[80];
  160. static char szParse[]  = _T("%08lX");
  161. static char szFormat[] = _T("%08lX: %s");
  162. HWND hwnd;
  163. BOOL bValid = FALSE;
  164. int iSel = m_lbWindows.GetCurSel();
  165. if (iSel >= 0)
  166. {
  167. m_lbWindows.GetText(iSel, szBuffer);
  168.   sscanf(szBuffer, szParse, &hwnd);
  169. bValid = ::IsWindow(hwnd);
  170. }
  171. if (bValid)
  172. {
  173. ::GetClassName(hwnd, szBuffer, sizeof(szBuffer));
  174. GetDlgItem(IDC_CLASS)->SetWindowText(szBuffer);
  175. HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(hwnd, GWL_HINSTANCE);
  176. ::GetModuleFileName(hInstance, szBuffer, sizeof(szBuffer));
  177. GetDlgItem(IDC_MODULE)->SetWindowText(szBuffer);
  178. HWND hwndParent = ::GetParent(hwnd);
  179. ::GetWindowText(hwndParent, szTemp, sizeof(szTemp));
  180. sprintf(szBuffer, szFormat, hwndParent, szTemp);
  181. GetDlgItem(IDC_PARENT)->SetWindowText(szBuffer);
  182. RECT rect;
  183. ::GetWindowRect(hwnd, &rect);
  184. sprintf(szBuffer, _T("(%d,%d) - (%d,%d)"), rect.left, rect.top,
  185. rect.right, rect.bottom);
  186. GetDlgItem(IDC_RECT)->SetWindowText(szBuffer);
  187. LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE);
  188. sprintf(szBuffer, _T("%08lX"), lStyle);
  189. GetDlgItem(IDC_STYLE)->SetWindowText(szBuffer);
  190. }
  191. else
  192. {
  193. szBuffer[0] = '';
  194. GetDlgItem(IDC_CLASS)->SetWindowText(szBuffer);
  195. GetDlgItem(IDC_MODULE)->SetWindowText(szBuffer);
  196. GetDlgItem(IDC_PARENT)->SetWindowText(szBuffer);
  197. GetDlgItem(IDC_RECT)->SetWindowText(szBuffer);
  198. GetDlgItem(IDC_STYLE)->SetWindowText(szBuffer);
  199. }
  200. }
  201. /////////////////////////////////////////////////////////////////////////////
  202. // CWndListDlg::OnTimer()
  203. //      OnTimer handles messages from the 1sec interval timer.  The variable
  204. //      m_iRate indicates how many timer messages must be received before
  205. //      the window list is updated.  The variable m_iTicks indicates how
  206. //      many timer messages have been received since the last time the
  207. //      window list was updated.
  208. void CWndListDlg::OnTimer(UINT nIDEvent)
  209. {
  210. if (m_iRate)
  211. {
  212. m_iTicks++;
  213. if (m_iTicks == m_iRate)
  214. OnOptionNow();
  215. }
  216. }
  217. /////////////////////////////////////////////////////////////////////////////
  218. // CWndListDlg::OnOptionNow()
  219. //      OnOptionNow resets the update interval counter, refills the window
  220. //      list, and resets the selection, if possible.
  221. void CWndListDlg::OnOptionNow()
  222. {
  223. m_iTicks = 0;
  224. int iTopIndex = m_lbWindows.GetTopIndex();
  225. CString strSelect;
  226. int iSel = m_lbWindows.GetCurSel();
  227. if (iSel >= 0)
  228. m_lbWindows.GetText(iSel, strSelect);
  229. WalkWindowList();
  230. if (m_lbWindows.SelectString(-1, strSelect) <= 0)
  231. m_lbWindows.SetCurSel(iSel);
  232. m_lbWindows.SetTopIndex(iTopIndex);
  233. }
  234. /////////////////////////////////////////////////////////////////////////////
  235. // CWndListDlg::OnOptionRate()
  236. //      OnOptionRate allows the user to specify the rate at which the
  237. //      window list should be updated.
  238. void CWndListDlg::OnOptionRate()
  239. {
  240. CRateDlg dlg(m_iRate, this);
  241. if (dlg.DoModal() == IDOK)
  242. m_iRate = dlg.GetRate();
  243. }
  244. /////////////////////////////////////////////////////////////////////////////
  245. // CWndListDlg::OnUpdateOptionRate()
  246. //      OnUpdateOptionRate enables or disables the Option Update Rate...
  247. //      command, depending on whether or not a timer has been created.
  248. void CWndListDlg::OnUpdateOptionRate(CCmdUI* pCmdUI)
  249. {
  250. pCmdUI->Enable(m_nIDTimer != 0);
  251. }
  252. /////////////////////////////////////////////////////////////////////////////
  253. // CWndListDlg::OnUpdateTime()
  254. //      OnUpdateTime updates the status bar clock.
  255. void CWndListDlg::OnUpdateTime(CCmdUI* pCmdUI)
  256. {
  257. CTime t = CTime::GetCurrentTime();
  258. char  szTime[6];
  259. int   nHour = t.GetHour();
  260. int   nMinute = t.GetMinute();
  261. // Base hours on 12 instead of 24
  262. if (nHour > 12)
  263. nHour -= 12;
  264. wsprintf(szTime, _T("%02i:%02i"), nHour, nMinute);
  265. // Now set the text of the pane
  266. CStatusBar* pStatusBar = GetStatusBar();
  267. pStatusBar->SetPaneText(pStatusBar->CommandToIndex(ID_INDICATOR_TIME),
  268. LPCSTR(szTime));
  269. pCmdUI->Enable();
  270. }