diff --git a/dlanguilib.visualdproj b/dlanguilib.visualdproj
index ee0c81e0..dca3cfc7 100644
--- a/dlanguilib.visualdproj
+++ b/dlanguilib.visualdproj
@@ -299,6 +299,7 @@
   <Folder name="src">
    <Folder name="dlangui">
     <Folder name="core">
+     <File path="src\dlangui\core\events.d" />
      <File path="src\dlangui\core\logger.d" />
      <File path="src\dlangui\core\types.d" />
     </Folder>
diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d
new file mode 100644
index 00000000..0370e790
--- /dev/null
+++ b/src/dlangui/core/events.d
@@ -0,0 +1,43 @@
+module dlangui.core.events;
+
+import std.conv;
+
+enum MouseAction : ushort {
+	LButtonDown,
+	LButtonUp,
+	MButtonDown,
+	MButtonUp,
+	RButtonDown,
+	RButtonUp,
+	Wheel,
+	Move,
+	Leave,
+	Hover
+}
+
+enum MouseFlag : ushort {
+	Control = 0x0008,
+	LButton = 0x0001,
+	MButton = 0x0010,
+	RButton = 0x0002,
+	Shift   = 0x0004,
+	XButton1= 0x0020,
+	XButton2= 0x0040
+}
+
+class MouseEvent {
+	protected MouseAction _action;
+	protected ushort _flags;
+	protected short _x;
+	protected short _y;
+	@property MouseAction action() { return _action; }
+	@property ushort flags() { return _flags; }
+	@property short x() { return _x; }
+	@property short y() { return _y; }
+	this (MouseAction a, ushort f, short x, short y) {
+		_action = a;
+		_flags = f;
+		_x = x;
+		_y = y;
+	}
+}
diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d
index 821a6663..b2de4ef1 100644
--- a/src/dlangui/platforms/common/platform.d
+++ b/src/dlangui/platforms/common/platform.d
@@ -1,5 +1,6 @@
 module dlangui.platforms.common.platform;
 
+public import dlangui.core.events;
 import dlangui.widgets.widget;
 import dlangui.graphics.drawbuf;
 import std.file;
@@ -37,6 +38,7 @@ class Window {
             _mainWidget.onDraw(buf);
         }
     }
+	abstract bool onMouseEvent(MouseEvent event);
 }
 
 class Platform {
diff --git a/src/dlangui/platforms/windows/winapp.d b/src/dlangui/platforms/windows/winapp.d
index adb3b270..30cdeff0 100644
--- a/src/dlangui/platforms/windows/winapp.d
+++ b/src/dlangui/platforms/windows/winapp.d
@@ -305,6 +305,11 @@ class Win32Window : Window {
             paintUsingGDI();
         }
     }
+
+	override bool onMouseEvent(MouseEvent event) {
+		Log.d("MouseEvent ", event.action, " flags=", event.flags, " x=", event.x, " y=", event.y);
+		return true;
+	}
 }
 
 class Win32Platform : Platform {
@@ -515,16 +520,38 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             return 1;
         case WM_PAINT:
             {
-                //GetClientRect(hwnd, &rect);
-                //int dx = rect.right - rect.left;
-                //int dy = rect.bottom - rect.top;
-                //window.onResize(dx, dy);
                 if (window !is null)
                     window.onPaint();
-
             }
             return 0; // processed
-
+		case WM_MOUSEMOVE:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.Move, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_LBUTTONDOWN:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.LButtonDown, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_MBUTTONDOWN:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.MButtonDown, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_RBUTTONDOWN:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.RButtonDown, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_LBUTTONUP:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.LButtonUp, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_MBUTTONUP:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.MButtonUp, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
+		case WM_RBUTTONUP:
+			if (window !is null)
+				window.onMouseEvent(new MouseEvent(MouseAction.RButtonUp, cast(ushort)wParam, cast(short)(lParam & 0xFFFF), cast(short)((lParam >> 16) & 0xFFFF)));
+			return 0; // processed
         case WM_DESTROY:
             window.onDestroy();
             PostQuitMessage(0);