OSDN Git Service

use boost_1_56_0 and build by VS2013
[yamy/yamy.git] / dlginvestigate.cpp
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
2 // dlginvestigate.cpp\r
3 \r
4 \r
5 #include "misc.h"\r
6 #include "engine.h"\r
7 #include "focus.h"\r
8 #include "hook.h"\r
9 #include "mayurc.h"\r
10 #include "stringtool.h"\r
11 #include "target.h"\r
12 #include "windowstool.h"\r
13 #include "vkeytable.h"\r
14 #include "dlginvestigate.h"\r
15 #include <iomanip>\r
16 \r
17 \r
18 ///\r
19 class DlgInvestigate\r
20 {\r
21         HWND m_hwnd;                                    ///\r
22         UINT m_WM_MAYU_MESSAGE;                 ///\r
23         DlgInvestigateData m_data;                      ///\r
24 \r
25 public:\r
26         ///\r
27         DlgInvestigate(HWND i_hwnd)\r
28                         : m_hwnd(i_hwnd),\r
29                         m_WM_MAYU_MESSAGE(RegisterWindowMessage(\r
30                                                                   addSessionId(WM_MAYU_MESSAGE_NAME).c_str())) {\r
31                 m_data.m_engine = NULL;\r
32                 m_data.m_hwndLog = NULL;\r
33         }\r
34 \r
35         /// WM_INITDIALOG\r
36         BOOL wmInitDialog(HWND /* i_focus */, LPARAM i_lParam) {\r
37                 m_data = *reinterpret_cast<DlgInvestigateData *>(i_lParam);\r
38                 setSmallIcon(m_hwnd, IDI_ICON_mayu);\r
39                 setBigIcon(m_hwnd, IDI_ICON_mayu);\r
40                 return TRUE;\r
41         }\r
42 \r
43         /// WM_DESTROY\r
44         BOOL wmDestroy() {\r
45                 unsetSmallIcon(m_hwnd);\r
46                 unsetBigIcon(m_hwnd);\r
47                 return TRUE;\r
48         }\r
49 \r
50         /// WM_CLOSE\r
51         BOOL wmClose() {\r
52                 ShowWindow(m_hwnd, SW_HIDE);\r
53                 return TRUE;\r
54         }\r
55 \r
56         /// WM_COMMAND\r
57         BOOL wmCommand(int /* i_notifyCode */, int i_id, HWND /* i_hwndControl */) {\r
58                 switch (i_id) {\r
59                 case IDOK: {\r
60                         ShowWindow(m_hwnd, SW_HIDE);\r
61                         return TRUE;\r
62                 }\r
63                 }\r
64                 return FALSE;\r
65         }\r
66 \r
67         /// WM_focusNotify\r
68         BOOL wmFocusNotify(bool i_isFocused, HWND i_hwndFocus) {\r
69                 if (m_data.m_engine &&\r
70                                 i_hwndFocus == GetDlgItem(m_hwnd, IDC_CUSTOM_scancode))\r
71                         m_data.m_engine->enableLogMode(i_isFocused);\r
72                 return TRUE;\r
73         }\r
74 \r
75         /// WM_targetNotify\r
76         BOOL wmTargetNotify(HWND i_hwndTarget) {\r
77                 _TCHAR className[GANA_MAX_ATOM_LENGTH];\r
78                 bool ok = false;\r
79                 if (GetClassName(i_hwndTarget, className, NUMBER_OF(className))) {\r
80                         if (_tcsicmp(className, _T("ConsoleWindowClass")) == 0) {\r
81                                 _TCHAR titleName[1024];\r
82                                 if (GetWindowText(i_hwndTarget, titleName, NUMBER_OF(titleName)) == 0)\r
83                                         titleName[0] = _T('\0');\r
84                                 {\r
85                                         Acquire a(&m_data.m_engine->m_log, 1);\r
86                                         m_data.m_engine->m_log << _T("HWND:\t") << std::hex\r
87                                         << reinterpret_cast<int>(i_hwndTarget)\r
88                                         << std::dec << std::endl;\r
89                                 }\r
90                                 Acquire a(&m_data.m_engine->m_log, 0);\r
91                                 m_data.m_engine->m_log << _T("CLASS:\t") << className << std::endl;\r
92                                 m_data.m_engine->m_log << _T("TITLE:\t") << titleName << std::endl;\r
93                                 ok = true;\r
94                         }\r
95                 }\r
96                 if (!ok)\r
97                         CHECK_TRUE( PostMessage(i_hwndTarget, m_WM_MAYU_MESSAGE,\r
98                                                                         MayuMessage_notifyName, 0) );\r
99                 return TRUE;\r
100         }\r
101 \r
102         /// WM_vkeyNotify\r
103         BOOL wmVkeyNotify(int i_nVirtKey, int /* i_repeatCount */,\r
104                                           BYTE /* i_scanCode */, bool i_isExtended,\r
105                                           bool /* i_isAltDown */, bool i_isKeyup) {\r
106                 Acquire a(&m_data.m_engine->m_log, 0);\r
107                 m_data.m_engine->m_log\r
108                 << (i_isExtended ? _T(" E-") : _T("   "))\r
109                 << _T("0x") << std::hex << std::setw(2) << std::setfill(_T('0'))\r
110                 << i_nVirtKey << std::dec << _T("  &VK( ")\r
111                 << (i_isExtended ? _T("E-") : _T("  "))\r
112                 << (i_isKeyup ? _T("U-") : _T("D-"));\r
113 \r
114                 for (const VKeyTable *vkt = g_vkeyTable; vkt->m_name; ++ vkt) {\r
115                         if (vkt->m_code == i_nVirtKey) {\r
116                                 m_data.m_engine->m_log << vkt->m_name << _T(" )") << std::endl;\r
117                                 return TRUE;\r
118                         }\r
119                 }\r
120                 m_data.m_engine->m_log << _T("0x") << std::hex << std::setw(2)\r
121                 << std::setfill(_T('0')) << i_nVirtKey << std::dec\r
122                 << _T(" )") << std::endl;\r
123                 return TRUE;\r
124         }\r
125 \r
126         BOOL wmMove(int /* i_x */, int /* i_y */) {\r
127                 RECT rc1, rc2;\r
128                 GetWindowRect(m_hwnd, &rc1);\r
129                 GetWindowRect(m_data.m_hwndLog, &rc2);\r
130 \r
131                 MoveWindow(m_data.m_hwndLog, rc1.left, rc1.bottom,\r
132                                    rcWidth(&rc2), rcHeight(&rc2), TRUE);\r
133 \r
134                 return TRUE;\r
135         }\r
136 };\r
137 \r
138 \r
139 //\r
140 #ifdef MAYU64\r
141 INT_PTR CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,\r
142 #else\r
143 BOOL CALLBACK dlgInvestigate_dlgProc(HWND i_hwnd, UINT i_message,\r
144 #endif\r
145                                                                                 WPARAM i_wParam, LPARAM i_lParam)\r
146 {\r
147         DlgInvestigate *wc;\r
148         getUserData(i_hwnd, &wc);\r
149         if (!wc)\r
150                 switch (i_message) {\r
151                 case WM_INITDIALOG:\r
152                         wc = setUserData(i_hwnd, new DlgInvestigate(i_hwnd));\r
153                         return wc->wmInitDialog(reinterpret_cast<HWND>(i_wParam), i_lParam);\r
154                 }\r
155         else\r
156                 switch (i_message) {\r
157                 case WM_MOVE:\r
158                         return wc->wmMove(static_cast<short>(LOWORD(i_lParam)),\r
159                                                           static_cast<short>(HIWORD(i_lParam)));\r
160                 case WM_COMMAND:\r
161                         return wc->wmCommand(HIWORD(i_wParam), LOWORD(i_wParam),\r
162                                                                  reinterpret_cast<HWND>(i_lParam));\r
163                 case WM_CLOSE:\r
164                         return wc->wmClose();\r
165                 case WM_DESTROY:\r
166                         return wc->wmDestroy();\r
167                 case WM_APP_notifyFocus:\r
168                         return wc->wmFocusNotify(!!i_wParam,\r
169                                                                          reinterpret_cast<HWND>(i_lParam));\r
170                 case WM_APP_targetNotify:\r
171                         return wc->wmTargetNotify(reinterpret_cast<HWND>(i_lParam));\r
172                 case WM_APP_notifyVKey:\r
173                         return wc->wmVkeyNotify(\r
174                                            static_cast<int>(i_wParam), static_cast<int>(i_lParam & 0xffff),\r
175                                            static_cast<BYTE>((i_lParam >> 16) & 0xff),\r
176                                            !!(i_lParam & (1 << 24)),\r
177                                            !!(i_lParam & (1 << 29)),\r
178                                            !!(i_lParam & (1 << 31)));\r
179                 case WM_NCDESTROY:\r
180                         delete wc;\r
181                         return TRUE;\r
182                 }\r
183         return FALSE;\r
184 }\r