00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #include "../SCOLPack/SO3SCOL.h"
00036 #include "../SO3Renderer/SO3Root.h"
00037 #include "../SO3Renderer/SO3Window.h"
00038 #include "SO3KeyboardHook.h"
00039 #include "SO3WidgetManager.h"
00040
00041 namespace SO3
00042 {
00043 LRESULT CALLBACK GetMessageProcKeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam);
00044 LRESULT CALLBACK GetProcKeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam);
00045
00046 SKeyboardHook* SKeyboardHook::instance = 0;
00047
00048 SKeyboardHook::SKeyboardHook()
00049 {
00050 instance = this;
00051 HINSTANCE hInstance = GetModuleHandle(0);
00052 getMsgHook = SetWindowsHookEx(WH_GETMESSAGE, GetMessageProcKeyBoardHook, hInstance, GetCurrentThreadId());
00053 getProcHook = SetWindowsHookEx(WH_CALLWNDPROC, GetProcKeyBoardHook, hInstance, GetCurrentThreadId());
00054 }
00055
00056 SKeyboardHook::~SKeyboardHook()
00057 {
00058 UnhookWindowsHookEx(getMsgHook);
00059 UnhookWindowsHookEx(getProcHook);
00060 instance = 0;
00061 }
00062
00063 void SKeyboardHook::handleHook(UINT msg, WindowHandle hwnd, WPARAM wParam, LPARAM lParam)
00064 {
00065 SWindow* window = SRoot::getSingleton().GetRenderWindow(hwnd);
00066 if (window != 0)
00067 {
00068
00069 if (msg == WM_KEYDOWN || msg == WM_KEYUP || msg == WM_CHAR || msg == WM_CANCELMODE ||
00070 msg == WM_SETCURSOR || msg == WM_DEADCHAR || msg == WM_SYSKEYDOWN ||
00071 msg == WM_SYSKEYUP || msg == WM_SYSDEADCHAR || msg == WM_SYSCHAR ||
00072 msg == WM_IME_CHAR || msg == WM_IME_COMPOSITION || msg == WM_IME_COMPOSITIONFULL ||
00073 msg == WM_IME_CONTROL || msg == WM_IME_ENDCOMPOSITION || msg == WM_IME_KEYDOWN ||
00074 msg == WM_IME_KEYUP || msg == WM_IME_NOTIFY || msg == WM_IME_REQUEST ||
00075 msg == WM_IME_SELECT || msg == WM_IME_SETCONTEXT || msg == WM_IME_STARTCOMPOSITION ||
00076 msg == WM_COPY || msg == WM_PASTE || msg == WM_CUT || msg == WM_HELP)
00077 SWidgetManager::getSingleton().InjectKeyEvent(msg, hwnd, wParam, lParam);
00078 else
00079 switch(msg)
00080 {
00081 case WM_ACTIVATE:
00082 {
00083
00084 bool active = (LOWORD(wParam) != WA_INACTIVE);
00085 if( !active )
00086 break;
00087 }
00088 case WM_DISPLAYCHANGE:
00089 case WM_MOVE:
00090 case WM_SIZE:
00091 case WM_SIZING:
00092 case WM_STYLECHANGED:
00093 case WM_SYSCOMMAND:
00094 case WM_WINDOWPOSCHANGED:
00095 case WM_SHOWWINDOW:
00096 {
00097 window->WindowMovedOrResized();
00098 break;
00099 }
00100
00101 case WM_LBUTTONDOWN:
00102 {
00103 int x = (int)LOWORD(lParam);
00104 int y = (int)HIWORD(lParam);
00105
00106
00107 window->RayCast(x, y);
00108
00109
00110 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_LEFT_BUTTON);
00111 break;
00112 }
00113
00114 case WM_LBUTTONUP:
00115 {
00116 int x = (int)LOWORD(lParam);
00117 int y = (int)HIWORD(lParam);
00118
00119
00120 window->RayCast(x, y);
00121
00122
00123 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_LEFT_BUTTON);
00124 break;
00125 }
00126
00127 case WM_LBUTTONDBLCLK:
00128 {
00129 int x = (int)LOWORD(lParam);
00130 int y = (int)HIWORD(lParam);
00131
00132
00133 window->RayCast(x, y);
00134
00135
00136 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_LEFT_BUTTON);
00137 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_LEFT_BUTTON);
00138 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_LEFT_BUTTON);
00139 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_LEFT_BUTTON);
00140 break;
00141 }
00142
00143 case WM_RBUTTONDOWN:
00144 {
00145 int x = (int)LOWORD(lParam);
00146 int y = (int)HIWORD(lParam);
00147
00148
00149 window->RayCast(x, y);
00150
00151
00152 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_RIGHT_BUTTON);
00153 break;
00154 }
00155
00156 case WM_RBUTTONUP:
00157 {
00158 int x = (int)LOWORD(lParam);
00159 int y = (int)HIWORD(lParam);
00160
00161
00162 window->RayCast(x, y);
00163
00164
00165 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_RIGHT_BUTTON);
00166 break;
00167 }
00168
00169 case WM_RBUTTONDBLCLK:
00170 {
00171 int x = (int)LOWORD(lParam);
00172 int y = (int)HIWORD(lParam);
00173
00174
00175 window->RayCast(x, y);
00176
00177
00178 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_RIGHT_BUTTON);
00179 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_RIGHT_BUTTON);
00180 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_RIGHT_BUTTON);
00181 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_RIGHT_BUTTON);
00182 break;
00183 }
00184
00185 case WM_MBUTTONDOWN:
00186 {
00187 int x = (int)LOWORD(lParam);
00188 int y = (int)HIWORD(lParam);
00189
00190
00191 window->RayCast(x, y);
00192
00193
00194 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_MIDDLE_BUTTON);
00195 break;
00196 }
00197
00198 case WM_MBUTTONUP:
00199 {
00200 int x = (int)LOWORD(lParam);
00201 int y = (int)HIWORD(lParam);
00202
00203
00204 window->RayCast(x, y);
00205
00206
00207 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_MIDDLE_BUTTON);
00208 break;
00209 }
00210
00211 case WM_MBUTTONDBLCLK:
00212 {
00213 int x = (int)LOWORD(lParam);
00214 int y = (int)HIWORD(lParam);
00215
00216
00217 window->RayCast(x, y);
00218
00219
00220 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_MIDDLE_BUTTON);
00221 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_MIDDLE_BUTTON);
00222 SWidgetManager::getSingleton().InjectMouseDown(window, x, y, MOUSE_MIDDLE_BUTTON);
00223 SWidgetManager::getSingleton().InjectMouseUp(window, x, y, MOUSE_MIDDLE_BUTTON);
00224 break;
00225 }
00226
00227 case WM_MOUSEMOVE:
00228 {
00229 int x = (int)LOWORD(lParam);
00230 int y = (int)HIWORD(lParam);
00231
00232 MouseButtonId btn = static_cast <MouseButtonId>(wParam&(MK_CONTROL|MK_LBUTTON|MK_MBUTTON|MK_RBUTTON|MK_SHIFT));
00233
00234
00235 window->RayCast(x, y);
00236
00237
00238 SWidgetManager::getSingleton().InjectMouseMove(window, x, y, btn);
00239 break;
00240 }
00241
00242 case WM_MOUSEWHEEL:
00243 {
00244 int scroll = (int)(short)HIWORD(wParam) / 120;
00245 int x = (int)(short)LOWORD(lParam);
00246 int y = (int)(short)HIWORD(lParam);
00247
00248 SWidgetManager::getSingleton().InjectMouseWheel(window, x, y, scroll);
00249 break;
00250 }
00251 }
00252 }
00253 }
00254
00255 LRESULT CALLBACK GetMessageProcKeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam)
00256 {
00257 if(nCode < 0)
00258 return CallNextHookEx(0, nCode, wParam, lParam);
00259
00260 if(nCode == HC_ACTION)
00261 {
00262 MSG* msg = (MSG*)lParam;
00263 if(wParam & PM_REMOVE)
00264 SKeyboardHook::instance->handleHook(msg->message, msg->hwnd, msg->wParam, msg->lParam);
00265 }
00266 return CallNextHookEx(0, nCode, wParam, lParam);
00267 }
00268
00269 LRESULT CALLBACK GetProcKeyBoardHook(int nCode, WPARAM wParam, LPARAM lParam)
00270 {
00271 if(nCode < 0)
00272 return CallNextHookEx(0, nCode, wParam, lParam);
00273
00274 if(nCode == HC_ACTION)
00275 {
00276 CWPSTRUCT* msg = (CWPSTRUCT*)lParam;
00277 SKeyboardHook::instance->handleHook(msg->message, msg->hwnd, msg->wParam, msg->lParam);
00278 }
00279 return CallNextHookEx(0, nCode, wParam, lParam);
00280 }
00281
00282 }