special_input_device 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,49 +6,49 @@
6
6
 
7
7
  #define MAXIMUM_WINDOW_NAME_LENGTH 256
8
8
 
9
- #define FLAT_CONTROL 0x0001
10
- #define FLAT_CONTROL_LEFT 0x0002
11
- #define FLAT_CONTROL_RIGHT 0x0004
12
- #define FLAT_CONTROLS (FLAT_CONTROL | FLAT_CONTROL_LEFT | FLAT_CONTROL_RIGHT)
13
- #define FLAT_SHIFT 0x0008
14
- #define FLAT_SHIFT_LEFT 0x0010
15
- #define FLAT_SHIFT_RIGHT 0x0020
16
- #define FLAT_SHIFTS (FLAT_SHIFT | FLAT_SHIFT_LEFT | FLAT_SHIFT_RIGHT)
17
- #define FLAT_ALTERNATE 0x0040
18
- #define FLAT_ALTERNATE_LEFT 0x0080
19
- #define FLAT_ALTERNATE_RIGHT 0x0100
20
- #define FLAT_MOUSE_LEFT 0x0800
21
- #define FLAT_MOUSE_MIDDLE 0x1000
22
- #define FLAT_MOUSE_RIGHT 0x2000
23
- #define FLAT_MOUSE_X1 0x4000
24
- #define FLAT_MOUSE_X2 0x8000
9
+ #define FLAG_CONTROL 0x0001
10
+ #define FLAG_CONTROL_LEFT 0x0002
11
+ #define FLAG_CONTROL_RIGHT 0x0004
12
+ #define FLAG_CONTROLS (FLAG_CONTROL | FLAG_CONTROL_LEFT | FLAG_CONTROL_RIGHT)
13
+ #define FLAG_SHIFT 0x0008
14
+ #define FLAG_SHIFT_LEFT 0x0010
15
+ #define FLAG_SHIFT_RIGHT 0x0020
16
+ #define FLAG_SHIFTS (FLAG_SHIFT | FLAG_SHIFT_LEFT | FLAG_SHIFT_RIGHT)
17
+ #define FLAG_ALTERNATE 0x0040
18
+ #define FLAG_ALTERNATE_LEFT 0x0080
19
+ #define FLAG_ALTERNATE_RIGHT 0x0100
20
+ #define FLAG_MOUSE_LEFT 0x0800
21
+ #define FLAG_MOUSE_MIDDLE 0x1000
22
+ #define FLAG_MOUSE_RIGHT 0x2000
23
+ #define FLAG_MOUSE_X1 0x4000
24
+ #define FLAG_MOUSE_X2 0x8000
25
25
 
26
26
  typedef struct {
27
- WORD flats;
27
+ WORD flags;
28
28
  SHORT x;
29
29
  SHORT y;
30
- ULONGLONG leftClick;
31
- ULONGLONG middleClick;
32
- ULONGLONG rightClick;
33
- ULONGLONG x1Click;
34
- ULONGLONG x2Click;
30
+ ULONGLONG leftClickTime;
31
+ ULONGLONG middleClickTime;
32
+ ULONGLONG rightClickTime;
33
+ ULONGLONG x1ClickTime;
34
+ ULONGLONG x2ClickTime;
35
35
  } SID_WINDOW_DATA;
36
36
 
37
37
  static WPARAM createMouseMessageWParam(SID_WINDOW_DATA *cData) {
38
38
  WPARAM cWParam = 0;
39
- if (cData->flats & FLAT_CONTROLS)
39
+ if (cData->flags & FLAG_CONTROLS)
40
40
  cWParam |= MK_CONTROL;
41
- if (cData->flats & FLAT_SHIFTS)
41
+ if (cData->flags & FLAG_SHIFTS)
42
42
  cWParam |= MK_SHIFT;
43
- if (cData->flats & FLAT_MOUSE_LEFT)
43
+ if (cData->flags & FLAG_MOUSE_LEFT)
44
44
  cWParam |= MK_LBUTTON;
45
- if (cData->flats & FLAT_MOUSE_MIDDLE)
45
+ if (cData->flags & FLAG_MOUSE_MIDDLE)
46
46
  cWParam |= MK_MBUTTON;
47
- if (cData->flats & FLAT_MOUSE_RIGHT)
47
+ if (cData->flags & FLAG_MOUSE_RIGHT)
48
48
  cWParam |= MK_RBUTTON;
49
- if (cData->flats & FLAT_MOUSE_X1)
49
+ if (cData->flags & FLAG_MOUSE_X1)
50
50
  cWParam |= MK_XBUTTON1;
51
- if (cData->flats & FLAT_MOUSE_X2)
51
+ if (cData->flags & FLAG_MOUSE_X2)
52
52
  cWParam |= MK_XBUTTON2;
53
53
  return cWParam;
54
54
  }
@@ -230,9 +230,9 @@ static VALUE ruby_find_child(VARIABLE_ARGUMENTS_C) {
230
230
  cClassName = className == Qnil ? NULL : RUBY_VALUE_TO_LPCTSTR(className);
231
231
  cAfter = after == Qnil ? NULL : ruby___window_get_handle_code(after);
232
232
  cHWND = FindWindowEx(ruby___window_get_handle_code(self), cAfter, cClassName, cWindowName);
233
- if (!cHWND)
233
+ if (GetLastError())
234
234
  RAISE_WIN32_ERROR();
235
- return ruby___window_new(cHWND);
235
+ return cHWND ? ruby___window_new(cHWND) : Qnil;
236
236
  }
237
237
 
238
238
  /*
@@ -246,8 +246,7 @@ static VALUE ruby_parent(VARIABLE_ARGUMENTS_C) {
246
246
  HWND cHWND;
247
247
  SCAN_ARGUMENTS("01", &includeOwner);
248
248
  cHWND = ruby___window_get_handle_code(self);
249
- return ruby___window_new(
250
- includeOwner && includeOwner != Qnil ? GetAncestor(cHWND, GA_PARENT) : GetParent(cHWND));
249
+ return ruby___window_new(includeOwner && includeOwner != Qnil ? GetAncestor(cHWND, GA_PARENT) : GetParent(cHWND));
251
250
  }
252
251
 
253
252
  /*
@@ -336,6 +335,17 @@ static VALUE ruby_hide(VALUE self) {
336
335
  return self;
337
336
  }
338
337
 
338
+ /*
339
+ * Restores the window.
340
+ * @return [SpecialInputDevice::Window] self
341
+ * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548.aspx Windows Dev Center - ShowWindow function
342
+ */
343
+ static VALUE ruby_restore(VALUE self) {
344
+ if (!ShowWindow(ruby___window_get_handle_code(self), SW_SHOWNORMAL))
345
+ RAISE_WIN32_ERROR();
346
+ return self;
347
+ }
348
+
339
349
  /*
340
350
  * Maximizes the window.
341
351
  * @return [SpecialInputDevice::Window] self
@@ -392,17 +402,6 @@ static VALUE ruby_resize_to(VALUE self, VALUE width, VALUE height) {
392
402
  return self;
393
403
  }
394
404
 
395
- /*
396
- * Restores the window.
397
- * @return [SpecialInputDevice::Window] self
398
- * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548.aspx Windows Dev Center - ShowWindow function
399
- */
400
- static VALUE ruby_restore(VALUE self) {
401
- if (!ShowWindow(ruby___window_get_handle_code(self), SW_SHOWNORMAL))
402
- RAISE_WIN32_ERROR();
403
- return self;
404
- }
405
-
406
405
  //endregion control
407
406
 
408
407
  //region display
@@ -416,11 +415,11 @@ static VALUE ruby_restore(VALUE self) {
416
415
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/dd144909.aspx Windows Dev Center - GetPixel function
417
416
  */
418
417
  static VALUE ruby_color_at(VALUE self, VALUE x, VALUE y) {
419
- HWND cWindow = ruby___window_get_handle_code(self);
418
+ HWND cWindow = ruby___window_get_handle_code(self);
420
419
  COLORREF cColor;
421
- HDC cWindowDC;
422
- POINT cPoint;
423
- RECT cWindowRectangle;
420
+ HDC cWindowDC;
421
+ POINT cPoint;
422
+ RECT cWindowRectangle;
424
423
  cPoint.x = NUM2LONG(x);
425
424
  cPoint.y = NUM2LONG(y);
426
425
  if (!ClientToScreen(cWindow, &cPoint))
@@ -428,7 +427,7 @@ static VALUE ruby_color_at(VALUE self, VALUE x, VALUE y) {
428
427
  if (!GetWindowRect(cWindow, &cWindowRectangle))
429
428
  RAISE_WIN32_ERROR();
430
429
  cWindowDC = GetWindowDC(cWindow);
431
- cColor = GetPixel(cWindowDC, cPoint.x - cWindowRectangle.left, cPoint.y - cWindowRectangle.top);
430
+ cColor = GetPixel(cWindowDC, cPoint.x - cWindowRectangle.left, cPoint.y - cWindowRectangle.top);
432
431
  ReleaseDC(cWindow, cWindowDC);
433
432
  return ruby___color_new_from_color_ref(cColor);
434
433
  }
@@ -573,156 +572,103 @@ static VALUE ruby_find_image(VARIABLE_ARGUMENTS_C) {
573
572
 
574
573
  //region keyboard
575
574
 
575
+ #define RUBY___KEY_HOLD_RELEASE(upDown, lParamFlags, flagsUpdateOperator, additionalLine) \
576
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
577
+ HWND cHWnd = ruby___window_get_handle_code(self);\
578
+ WPARAM cWParam[cCount];\
579
+ LPARAM cLParam[cCount];\
580
+ INT cT;\
581
+ SCAN_ARGUMENTS("1*", NULL, NULL);\
582
+ for (cT = 0; cT < cCount; cT++) {\
583
+ cWParam[cT] = NUM2USHORT(cArguments[cT]);\
584
+ cLParam[cT] = (LPARAM) (lParamFlags | (WORD) MapVirtualKeyA(cWParam[cT], MAPVK_VK_TO_VSC) << 16);\
585
+ }\
586
+ for (cT = 0; cT < cCount; cT++) {\
587
+ PostMessage(cHWnd, WM_KEY ## upDown, cWParam[cT], cLParam[cT]);\
588
+ additionalLine\
589
+ switch (cWParam[cT]) {\
590
+ case VK_CONTROL:\
591
+ cData->flags flagsUpdateOperator FLAG_CONTROL;\
592
+ break;\
593
+ case VK_LCONTROL:\
594
+ cData->flags flagsUpdateOperator FLAG_CONTROL_LEFT;\
595
+ break;\
596
+ case VK_RCONTROL:\
597
+ cData->flags flagsUpdateOperator FLAG_CONTROL_RIGHT;\
598
+ break;\
599
+ case VK_SHIFT:\
600
+ cData->flags flagsUpdateOperator FLAG_SHIFT;\
601
+ break;\
602
+ case VK_LSHIFT:\
603
+ cData->flags flagsUpdateOperator FLAG_SHIFT_LEFT;\
604
+ break;\
605
+ case VK_RSHIFT:\
606
+ cData->flags flagsUpdateOperator FLAG_SHIFT_RIGHT;\
607
+ break;\
608
+ case VK_MENU:\
609
+ cData->flags flagsUpdateOperator FLAG_ALTERNATE;\
610
+ break;\
611
+ case VK_LMENU:\
612
+ cData->flags flagsUpdateOperator FLAG_ALTERNATE_LEFT;\
613
+ break;\
614
+ case VK_RMENU:\
615
+ cData->flags flagsUpdateOperator FLAG_ALTERNATE_RIGHT;\
616
+ break;\
617
+ default:\
618
+ break;\
619
+ }\
620
+ }\
621
+ return self;
622
+
576
623
  /*
577
- * @overload key_hold(key_code)
624
+ * @overload key_hold(key_code, *more)
578
625
  * Simulate holding the specified key down in the window. User would not lose the control of computer.
579
626
  * @param [Integer] key_code virtual key code. Use a value of constant in {SpecialInputDevice::KeyCode}.
627
+ * @param [Array[Integer]] more more key codes
580
628
  * @return [SpecialInputDevice::Window] self
581
629
  * @see SpecialInputDevice::Keyboard.hold
582
630
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
583
631
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646280.aspx Windows Dev Center - WM_KEYDOWN message
584
632
  */
585
- static VALUE ruby_key_hold(VALUE self, VALUE keyCode) {
586
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
587
- HWND cHWnd = ruby___window_get_handle_code(self);
588
- WPARAM cWParam = NUM2USHORT(keyCode);
589
- LPARAM cLParam = 1 | (WORD) MapVirtualKeyA(cWParam, MAPVK_VK_TO_VSC) << 16;
590
- PostMessage(cHWnd, WM_KEYDOWN, cWParam, cLParam);
591
- switch (cWParam) {
592
- case VK_CONTROL:
593
- cData->flats |= FLAT_CONTROL;
594
- break;
595
- case VK_LCONTROL:
596
- cData->flats |= FLAT_CONTROL_LEFT;
597
- break;
598
- case VK_RCONTROL:
599
- cData->flats |= FLAT_CONTROL_RIGHT;
600
- break;
601
- case VK_SHIFT:
602
- cData->flats |= FLAT_SHIFT;
603
- break;
604
- case VK_LSHIFT:
605
- cData->flats |= FLAT_SHIFT_LEFT;
606
- break;
607
- case VK_RSHIFT:
608
- cData->flats |= FLAT_SHIFT_RIGHT;
609
- break;
610
- case VK_MENU:
611
- cData->flats |= FLAT_ALTERNATE;
612
- break;
613
- case VK_LMENU:
614
- cData->flats |= FLAT_ALTERNATE_LEFT;
615
- break;
616
- case VK_RMENU:
617
- cData->flats |= FLAT_ALTERNATE_RIGHT;
618
- break;
619
- default:
620
- break;
621
- }
622
- return self;
633
+ static VALUE ruby_key_hold(VARIABLE_ARGUMENTS_C) {
634
+ RUBY___KEY_HOLD_RELEASE(DOWN, 0x00000001, |=,)
623
635
  }
624
636
 
625
637
  /*
626
638
  * @overload key_release(key_code)
627
639
  * Simulate releasing the specified key in the window. User would not lose the control of computer.
628
640
  * @param [Integer] key_code virtual key code. Use a value of constant in {SpecialInputDevice::KeyCode}.
641
+ * @param [Array[Integer]] more more key codes
629
642
  * @return [SpecialInputDevice::Window] self
630
643
  * @see SpecialInputDevice::Keyboard.release
631
644
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
632
645
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646281.aspx Windows Dev Center - WM_KEYUP message
633
646
  */
634
- static VALUE ruby_key_release(VALUE self, VALUE keyCode) {
635
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
636
- HWND cHWnd = ruby___window_get_handle_code(self);
637
- WPARAM cWParam = NUM2USHORT(keyCode);
638
- LPARAM cLParam = 1;
639
- cLParam |= (WORD) MapVirtualKeyA(cWParam, MAPVK_VK_TO_VSC) << 16;
640
- cLParam |= 0xA0000000;
641
- PostMessage(cHWnd, WM_KEYUP, cWParam, cLParam);
642
- switch (cWParam) {
643
- case VK_CONTROL:
644
- cData->flats &= ~FLAT_CONTROL;
645
- break;
646
- case VK_LCONTROL:
647
- cData->flats &= ~FLAT_CONTROL_LEFT;
648
- break;
649
- case VK_RCONTROL:
650
- cData->flats &= ~FLAT_CONTROL_RIGHT;
651
- break;
652
- case VK_SHIFT:
653
- cData->flats &= ~FLAT_SHIFT;
654
- break;
655
- case VK_LSHIFT:
656
- cData->flats &= ~FLAT_SHIFT_LEFT;
657
- break;
658
- case VK_RSHIFT:
659
- cData->flats &= ~FLAT_SHIFT_RIGHT;
660
- break;
661
- case VK_MENU:
662
- cData->flats &= ~FLAT_ALTERNATE;
663
- break;
664
- case VK_LMENU:
665
- cData->flats &= ~FLAT_ALTERNATE_LEFT;
666
- break;
667
- case VK_RMENU:
668
- cData->flats &= ~FLAT_ALTERNATE_RIGHT;
669
- break;
670
- default:
671
- break;
672
- }
673
- return self;
647
+ static VALUE ruby_key_release(VARIABLE_ARGUMENTS_C) {
648
+ RUBY___KEY_HOLD_RELEASE(UP, 0xA0000001, &= ~,)
674
649
  }
675
650
 
676
651
  /*
677
652
  * @overload key_press(key_code)
678
653
  * Simulate pressing the specified key in the window. User would not lose the control of computer.
679
654
  * @param [Integer] key_code virtual key code. Use a value of constant in {SpecialInputDevice::KeyCode}.
655
+ * @param [Array[Integer]] more more key codes
680
656
  * @return [SpecialInputDevice::Window] self
681
657
  * @see SpecialInputDevice::Keyboard.press
682
658
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
683
659
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646280.aspx Windows Dev Center - WM_KEYDOWN message
684
660
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646281.aspx Windows Dev Center - WM_KEYUP message
685
661
  */
686
- static VALUE ruby_key_press(VALUE self, VALUE keyCode) {
687
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
688
- HWND cHWnd = ruby___window_get_handle_code(self);
689
- WPARAM cWParam = NUM2USHORT(keyCode);
690
- LPARAM cLParam = 1 | (WORD) MapVirtualKeyA(cWParam, MAPVK_VK_TO_VSC) << 16;
691
- PostMessage(cHWnd, WM_KEYDOWN, cWParam, cLParam);
692
- cLParam |= 0xA0000000;
693
- PostMessage(cHWnd, WM_KEYUP, cWParam, cLParam);
694
- switch (cWParam) {
695
- case VK_CONTROL:
696
- cData->flats &= ~FLAT_CONTROL;
697
- break;
698
- case VK_LCONTROL:
699
- cData->flats &= ~FLAT_CONTROL_LEFT;
700
- break;
701
- case VK_RCONTROL:
702
- cData->flats &= ~FLAT_CONTROL_RIGHT;
703
- break;
704
- case VK_SHIFT:
705
- cData->flats &= ~FLAT_SHIFT;
706
- break;
707
- case VK_LSHIFT:
708
- cData->flats &= ~FLAT_SHIFT_LEFT;
709
- break;
710
- case VK_RSHIFT:
711
- cData->flats &= ~FLAT_SHIFT_RIGHT;
712
- break;
713
- case VK_MENU:
714
- cData->flats &= ~FLAT_ALTERNATE;
715
- break;
716
- case VK_LMENU:
717
- cData->flats &= ~FLAT_ALTERNATE_LEFT;
718
- break;
719
- case VK_RMENU:
720
- cData->flats &= ~FLAT_ALTERNATE_RIGHT;
721
- break;
722
- default:
723
- break;
724
- }
725
- return self;
662
+ static VALUE ruby_key_press(VARIABLE_ARGUMENTS_C) {
663
+ RUBY___KEY_HOLD_RELEASE(
664
+ DOWN,
665
+ 0x00000001,
666
+ &= ~,
667
+ {
668
+ cLParam[cT] |= 0xA0000000;
669
+ PostMessage(cHWnd, WM_KEYUP, cWParam[cT], cLParam[cT]);
670
+ }
671
+ )
726
672
  }
727
673
 
728
674
  //endregion keyboard
@@ -731,6 +677,14 @@ static VALUE ruby_key_press(VALUE self, VALUE keyCode) {
731
677
 
732
678
  //region move
733
679
 
680
+ #define RUBY___MOUSE_MOVE(xYOperator) \
681
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
682
+ HWND cHWnd = ruby___window_get_handle_code(self);\
683
+ cData->x xYOperator NUM2SHORT(x);\
684
+ cData->y xYOperator NUM2SHORT(y);\
685
+ PostMessage(cHWnd, WM_MOUSEMOVE, createMouseMessageWParam(cData), createMouseMessageLParam(cData));\
686
+ return self;
687
+
734
688
  /*
735
689
  * @overload mouse_move_relatively(x, y)
736
690
  * Move the cursor position relative to current position.
@@ -741,12 +695,7 @@ static VALUE ruby_key_press(VALUE self, VALUE keyCode) {
741
695
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645616.aspx Windows Dev Center - WM_MOUSEMOVE message
742
696
  */
743
697
  static VALUE ruby_mouse_move_relatively(VALUE self, VALUE x, VALUE y) {
744
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
745
- HWND cHWnd = ruby___window_get_handle_code(self);
746
- cData->x += NUM2SHORT(x);
747
- cData->y += NUM2SHORT(y);
748
- PostMessage(cHWnd, WM_MOUSEMOVE, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
749
- return self;
698
+ RUBY___MOUSE_MOVE(+=)
750
699
  }
751
700
 
752
701
  /*
@@ -760,16 +709,52 @@ static VALUE ruby_mouse_move_relatively(VALUE self, VALUE x, VALUE y) {
760
709
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645616.aspx Windows Dev Center - WM_MOUSEMOVE message
761
710
  */
762
711
  static VALUE ruby_mouse_move_to(VALUE self, VALUE x, VALUE y) {
763
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
764
- HWND cHWnd = ruby___window_get_handle_code(self);
765
- cData->x = NUM2SHORT(x);
766
- cData->y = NUM2SHORT(y);
767
- PostMessage(cHWnd, WM_MOUSEMOVE, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
768
- return self;
712
+ RUBY___MOUSE_MOVE(=)
769
713
  }
770
714
 
771
715
  //endregion move
772
716
 
717
+ #define RUBY___MOUSE_CLICK(dataFlag, messageNamePrefix, wParamAdditionalExpression, clickTimePrefix) \
718
+ VALUE times;\
719
+ UINT cTimes;\
720
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
721
+ ULONGLONG cCurrentTime = getSystemTimeIdentifier();\
722
+ HWND cHWnd = ruby___window_get_handle_code(self);\
723
+ UINT cT;\
724
+ SCAN_ARGUMENTS("01", &times);\
725
+ if (times == Qnil)\
726
+ cTimes = 1;\
727
+ else\
728
+ cTimes = NUM2UINT(times);\
729
+ for (cT = 0; cT < cTimes; cT++) {\
730
+ cData->flags |= dataFlag;\
731
+ PostMessage(cHWnd, messageNamePrefix ## DOWN, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
732
+ if (cData-> clickTimePrefix ## ClickTime && cData-> clickTimePrefix ## ClickTime + GetDoubleClickTime() * 10000 >= cCurrentTime)\
733
+ PostMessage(cHWnd, messageNamePrefix ## DBLCLK, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
734
+ cData->flags &= ~dataFlag;\
735
+ PostMessage(cHWnd, messageNamePrefix ## UP, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
736
+ cData-> clickTimePrefix ## ClickTime = cCurrentTime;\
737
+ }\
738
+ return self;
739
+
740
+ #define RUBY___MOUSE_DOWN(dataFlag, messageNamePrefix, wParamAdditionalExpression, clickTimePrefix) \
741
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
742
+ ULONGLONG cCurrentTime = getSystemTimeIdentifier();\
743
+ HWND cHWnd = ruby___window_get_handle_code(self);\
744
+ cData->flags |= dataFlag;\
745
+ PostMessage(cHWnd, messageNamePrefix ## DOWN, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
746
+ if (cData-> clickTimePrefix ## ClickTime && cData-> clickTimePrefix ## ClickTime + GetDoubleClickTime() * 10000 >= cCurrentTime)\
747
+ PostMessage(cHWnd, messageNamePrefix ## DBLCLK, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
748
+ cData-> clickTimePrefix ## ClickTime = cCurrentTime;\
749
+ return self;
750
+
751
+ #define RUBY___MOUSE_UP(dataFlag, messageNamePrefix, wParamAdditionalExpression) \
752
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
753
+ HWND cHWnd = ruby___window_get_handle_code(self);\
754
+ cData->flags &= ~dataFlag;\
755
+ PostMessage(cHWnd, messageNamePrefix ## UP, createMouseMessageWParam(cData) wParamAdditionalExpression, createMouseMessageLParam(cData));\
756
+ return self;
757
+
773
758
  //region left_button
774
759
 
775
760
  /*
@@ -781,18 +766,9 @@ static VALUE ruby_mouse_move_to(VALUE self, VALUE x, VALUE y) {
781
766
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645607.aspx Windows Dev Center - WM_LBUTTONDOWN message
782
767
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645608.aspx Windows Dev Center - WM_LBUTTONUP message
783
768
  */
784
- static VALUE ruby_mouse_left_click(VALUE self) {
785
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
786
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
787
- HWND cHWnd = ruby___window_get_handle_code(self);
788
- cData->flats |= FLAT_MOUSE_LEFT;
789
- PostMessage(cHWnd, WM_LBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
790
- if (cData->leftClick && cData->leftClick + GetDoubleClickTime() <= cCurrentTime)
791
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
792
- cData->flats &= ~FLAT_MOUSE_LEFT;
793
- PostMessage(cHWnd, WM_LBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
794
- cData->leftClick = cCurrentTime;
795
- return self;
769
+ static VALUE ruby_mouse_left_click(VARIABLE_ARGUMENTS_C) {
770
+ getSystemTimeIdentifier();
771
+ RUBY___MOUSE_CLICK(FLAG_MOUSE_LEFT, WM_LBUTTON, , left)
796
772
  }
797
773
 
798
774
  /*
@@ -804,15 +780,7 @@ static VALUE ruby_mouse_left_click(VALUE self) {
804
780
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645607.aspx Windows Dev Center - WM_LBUTTONDOWN message
805
781
  */
806
782
  static VALUE ruby_mouse_left_down(VALUE self) {
807
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
808
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
809
- HWND cHWnd = ruby___window_get_handle_code(self);
810
- cData->flats |= FLAT_MOUSE_LEFT;
811
- PostMessage(cHWnd, WM_LBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
812
- if (cData->leftClick && cData->leftClick + GetDoubleClickTime() <= cCurrentTime)
813
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
814
- cData->leftClick = cCurrentTime;
815
- return self;
783
+ RUBY___MOUSE_DOWN(FLAG_MOUSE_LEFT, WM_LBUTTON, , left)
816
784
  }
817
785
 
818
786
  /*
@@ -823,11 +791,7 @@ static VALUE ruby_mouse_left_down(VALUE self) {
823
791
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645608.aspx Windows Dev Center - WM_LBUTTONUP message
824
792
  */
825
793
  static VALUE ruby_mouse_left_up(VALUE self) {
826
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
827
- HWND cHWnd = ruby___window_get_handle_code(self);
828
- cData->flats &= ~FLAT_MOUSE_LEFT;
829
- PostMessage(cHWnd, WM_LBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
830
- return self;
794
+ RUBY___MOUSE_UP(FLAG_MOUSE_LEFT, WM_LBUTTON,)
831
795
  }
832
796
 
833
797
  //endregion left_button
@@ -843,18 +807,8 @@ static VALUE ruby_mouse_left_up(VALUE self) {
843
807
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646242.aspx Windows Dev Center - WM_RBUTTONDOWN function
844
808
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646243.aspx Windows Dev Center - WM_RBUTTONUP function
845
809
  */
846
- static VALUE ruby_mouse_right_click(VALUE self) {
847
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
848
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
849
- HWND cHWnd = ruby___window_get_handle_code(self);
850
- cData->flats |= FLAT_MOUSE_RIGHT;
851
- PostMessage(cHWnd, WM_RBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
852
- if (cData->rightClick && cData->rightClick + GetDoubleClickTime() <= cCurrentTime)
853
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
854
- cData->flats &= ~FLAT_MOUSE_RIGHT;
855
- PostMessage(cHWnd, WM_RBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
856
- cData->rightClick = cCurrentTime;
857
- return self;
810
+ static VALUE ruby_mouse_right_click(VARIABLE_ARGUMENTS_C) {
811
+ RUBY___MOUSE_CLICK(FLAG_MOUSE_RIGHT, WM_RBUTTON, , right)
858
812
  }
859
813
 
860
814
  /*
@@ -866,15 +820,7 @@ static VALUE ruby_mouse_right_click(VALUE self) {
866
820
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646242.aspx Windows Dev Center - WM_RBUTTONDOWN function
867
821
  */
868
822
  static VALUE ruby_mouse_right_down(VALUE self) {
869
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
870
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
871
- HWND cHWnd = ruby___window_get_handle_code(self);
872
- cData->flats |= FLAT_MOUSE_RIGHT;
873
- PostMessage(cHWnd, WM_RBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
874
- if (cData->rightClick && cData->rightClick + GetDoubleClickTime() <= cCurrentTime)
875
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
876
- cData->rightClick = cCurrentTime;
877
- return self;
823
+ RUBY___MOUSE_DOWN(FLAG_MOUSE_RIGHT, WM_RBUTTON, , right)
878
824
  }
879
825
 
880
826
  /*
@@ -885,11 +831,7 @@ static VALUE ruby_mouse_right_down(VALUE self) {
885
831
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646243.aspx Windows Dev Center - WM_RBUTTONUP function
886
832
  */
887
833
  static VALUE ruby_mouse_right_up(VALUE self) {
888
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
889
- HWND cHWnd = ruby___window_get_handle_code(self);
890
- cData->flats &= ~FLAT_MOUSE_RIGHT;
891
- PostMessage(cHWnd, WM_RBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
892
- return self;
834
+ RUBY___MOUSE_UP(FLAG_MOUSE_RIGHT, WM_RBUTTON,)
893
835
  }
894
836
 
895
837
  //endregion right_button
@@ -905,18 +847,8 @@ static VALUE ruby_mouse_right_up(VALUE self) {
905
847
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645610.aspx Windows Dev Center - WM_MBUTTONDOWN function
906
848
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645611.aspx Windows Dev Center - WM_MBUTTONUP function
907
849
  */
908
- static VALUE ruby_mouse_middle_click(VALUE self) {
909
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
910
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
911
- HWND cHWnd = ruby___window_get_handle_code(self);
912
- cData->flats |= FLAT_MOUSE_MIDDLE;
913
- PostMessage(cHWnd, WM_MBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
914
- if (cData->middleClick && cData->middleClick + GetDoubleClickTime() <= cCurrentTime)
915
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
916
- cData->flats &= ~FLAT_MOUSE_MIDDLE;
917
- PostMessage(cHWnd, WM_MBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
918
- cData->middleClick = cCurrentTime;
919
- return self;
850
+ static VALUE ruby_mouse_middle_click(VARIABLE_ARGUMENTS_C) {
851
+ RUBY___MOUSE_CLICK(FLAG_MOUSE_MIDDLE, WM_MBUTTON, , middle)
920
852
  }
921
853
 
922
854
  /*
@@ -928,15 +860,7 @@ static VALUE ruby_mouse_middle_click(VALUE self) {
928
860
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645610.aspx Windows Dev Center - WM_MBUTTONDOWN function
929
861
  */
930
862
  static VALUE ruby_mouse_middle_down(VALUE self) {
931
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
932
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
933
- HWND cHWnd = ruby___window_get_handle_code(self);
934
- cData->flats |= FLAT_MOUSE_MIDDLE;
935
- PostMessage(cHWnd, WM_MBUTTONDOWN, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
936
- if (cData->middleClick && cData->middleClick + GetDoubleClickTime() <= cCurrentTime)
937
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
938
- cData->middleClick = cCurrentTime;
939
- return self;
863
+ RUBY___MOUSE_DOWN(FLAG_MOUSE_MIDDLE, WM_MBUTTON, , middle)
940
864
  }
941
865
 
942
866
  /*
@@ -947,11 +871,7 @@ static VALUE ruby_mouse_middle_down(VALUE self) {
947
871
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645611.aspx Windows Dev Center - WM_MBUTTONUP function
948
872
  */
949
873
  static VALUE ruby_mouse_middle_up(VALUE self) {
950
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
951
- HWND cHWnd = ruby___window_get_handle_code(self);
952
- cData->flats &= ~FLAT_MOUSE_MIDDLE;
953
- PostMessage(cHWnd, WM_MBUTTONUP, createMouseMessageWParam(cData), createMouseMessageLParam(cData));
954
- return self;
874
+ RUBY___MOUSE_UP(FLAG_MOUSE_MIDDLE, WM_MBUTTON,)
955
875
  }
956
876
 
957
877
  //endregion middle_button
@@ -967,20 +887,8 @@ static VALUE ruby_mouse_middle_up(VALUE self) {
967
887
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646245.aspx Windows Dev Center - WM_XBUTTONDOWN function
968
888
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646246.aspx Windows Dev Center - WM_XBUTTONUP function
969
889
  */
970
- static VALUE ruby_mouse_x1_click(VALUE self) {
971
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
972
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
973
- HWND cHWnd = ruby___window_get_handle_code(self);
974
- cData->flats |= FLAT_MOUSE_X1;
975
- PostMessage(cHWnd, WM_XBUTTONDOWN, createMouseMessageWParam(cData) | XBUTTON1 << 16,
976
- createMouseMessageLParam(cData));
977
- if (cData->x1Click && cData->x1Click + GetDoubleClickTime() <= cCurrentTime)
978
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData) | XBUTTON1 << 16,
979
- createMouseMessageLParam(cData));
980
- cData->flats &= ~FLAT_MOUSE_X1;
981
- PostMessage(cHWnd, WM_XBUTTONUP, createMouseMessageWParam(cData) | XBUTTON1 << 16, createMouseMessageLParam(cData));
982
- cData->x1Click = cCurrentTime;
983
- return self;
890
+ static VALUE ruby_mouse_x1_click(VARIABLE_ARGUMENTS_C) {
891
+ RUBY___MOUSE_CLICK(FLAG_MOUSE_X1, WM_XBUTTON, | XBUTTON1 << 16, x1)
984
892
  }
985
893
 
986
894
  /*
@@ -992,17 +900,7 @@ static VALUE ruby_mouse_x1_click(VALUE self) {
992
900
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646245.aspx Windows Dev Center - WM_XBUTTONDOWN function
993
901
  */
994
902
  static VALUE ruby_mouse_x1_down(VALUE self) {
995
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
996
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
997
- HWND cHWnd = ruby___window_get_handle_code(self);
998
- cData->flats |= FLAT_MOUSE_X1;
999
- PostMessage(cHWnd, WM_XBUTTONDOWN, createMouseMessageWParam(cData) | XBUTTON1 << 16,
1000
- createMouseMessageLParam(cData));
1001
- if (cData->x1Click && cData->x1Click + GetDoubleClickTime() <= cCurrentTime)
1002
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData) | XBUTTON1 << 16,
1003
- createMouseMessageLParam(cData));
1004
- cData->x1Click = cCurrentTime;
1005
- return self;
903
+ RUBY___MOUSE_DOWN(FLAG_MOUSE_X1, WM_XBUTTON, | XBUTTON1 << 16, x1)
1006
904
  }
1007
905
 
1008
906
  /*
@@ -1013,11 +911,7 @@ static VALUE ruby_mouse_x1_down(VALUE self) {
1013
911
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646246.aspx Windows Dev Center - WM_XBUTTONUP function
1014
912
  */
1015
913
  static VALUE ruby_mouse_x1_up(VALUE self) {
1016
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1017
- HWND cHWnd = ruby___window_get_handle_code(self);
1018
- cData->flats &= ~FLAT_MOUSE_X1;
1019
- PostMessage(cHWnd, WM_XBUTTONUP, createMouseMessageWParam(cData) | XBUTTON1 << 16, createMouseMessageLParam(cData));
1020
- return self;
914
+ RUBY___MOUSE_UP(FLAG_MOUSE_X1, WM_XBUTTON, | XBUTTON1 << 16)
1021
915
  }
1022
916
 
1023
917
  /*
@@ -1029,20 +923,8 @@ static VALUE ruby_mouse_x1_up(VALUE self) {
1029
923
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646245.aspx Windows Dev Center - WM_XBUTTONDOWN function
1030
924
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646246.aspx Windows Dev Center - WM_XBUTTONUP function
1031
925
  */
1032
- static VALUE ruby_mouse_x2_click(VALUE self) {
1033
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1034
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
1035
- HWND cHWnd = ruby___window_get_handle_code(self);
1036
- cData->flats |= FLAT_MOUSE_X2;
1037
- PostMessage(cHWnd, WM_XBUTTONDOWN, createMouseMessageWParam(cData) | XBUTTON2 << 16,
1038
- createMouseMessageLParam(cData));
1039
- if (cData->x2Click && cData->x2Click + GetDoubleClickTime() <= cCurrentTime)
1040
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData) | XBUTTON2 << 16,
1041
- createMouseMessageLParam(cData));
1042
- cData->flats &= ~FLAT_MOUSE_X2;
1043
- PostMessage(cHWnd, WM_XBUTTONUP, createMouseMessageWParam(cData) | XBUTTON2 << 16, createMouseMessageLParam(cData));
1044
- cData->x2Click = cCurrentTime;
1045
- return self;
926
+ static VALUE ruby_mouse_x2_click(VARIABLE_ARGUMENTS_C) {
927
+ RUBY___MOUSE_CLICK(FLAG_MOUSE_X2, WM_XBUTTON, | XBUTTON2 << 16, x2)
1046
928
  }
1047
929
 
1048
930
  /*
@@ -1054,17 +936,7 @@ static VALUE ruby_mouse_x2_click(VALUE self) {
1054
936
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646245.aspx Windows Dev Center - WM_XBUTTONDOWN function
1055
937
  */
1056
938
  static VALUE ruby_mouse_x2_down(VALUE self) {
1057
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1058
- ULONGLONG cCurrentTime = getSystemTimeIdentifier();
1059
- HWND cHWnd = ruby___window_get_handle_code(self);
1060
- cData->flats |= FLAT_MOUSE_X2;
1061
- PostMessage(cHWnd, WM_XBUTTONDOWN, createMouseMessageWParam(cData) | XBUTTON2 << 16,
1062
- createMouseMessageLParam(cData));
1063
- if (cData->x2Click && cData->x2Click + GetDoubleClickTime() <= cCurrentTime)
1064
- PostMessage(cHWnd, WM_LBUTTONDBLCLK, createMouseMessageWParam(cData) | XBUTTON2 << 16,
1065
- createMouseMessageLParam(cData));
1066
- cData->x2Click = cCurrentTime;
1067
- return self;
939
+ RUBY___MOUSE_DOWN(FLAG_MOUSE_X2, WM_XBUTTON, | XBUTTON2 << 16, x2)
1068
940
  }
1069
941
 
1070
942
  /*
@@ -1075,17 +947,33 @@ static VALUE ruby_mouse_x2_down(VALUE self) {
1075
947
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms646246.aspx Windows Dev Center - WM_XBUTTONUP function
1076
948
  */
1077
949
  static VALUE ruby_mouse_x2_up(VALUE self) {
1078
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1079
- HWND cHWnd = ruby___window_get_handle_code(self);
1080
- cData->flats &= ~FLAT_MOUSE_X2;
1081
- PostMessage(cHWnd, WM_XBUTTONUP, createMouseMessageWParam(cData) | XBUTTON2 << 16, createMouseMessageLParam(cData));
1082
- return self;
950
+ RUBY___MOUSE_UP(FLAG_MOUSE_X2, WM_XBUTTON, | XBUTTON2 << 16)
1083
951
  }
1084
952
 
1085
953
  //endregion x_button
1086
954
 
1087
955
  //region wheel
1088
956
 
957
+ #define RUBY___MOUSE_SCROLL_NEGATIVE_DIRECTION(oppositeDirection) \
958
+ VALUE times = cCount ? rb_funcall(cArguments[0], rb_intern_const("-@"), 0) : INT2FIX(-1);\
959
+ return oppositeDirection(1, &times, self);
960
+
961
+ #define RUBY___MOUSE_SCROLL_POSITIVE_DIRECTION(directionPrefix) \
962
+ VALUE times;\
963
+ SHORT cTimes;\
964
+ SCAN_ARGUMENTS("01", &times);\
965
+ if (times == Qnil)\
966
+ cTimes = 1;\
967
+ else\
968
+ cTimes = NUM2SHORT(times);\
969
+ SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();\
970
+ HWND cHWnd = ruby___window_get_handle_code(self);\
971
+ PostMessage(cHWnd, WM_MOUSE ## directionPrefix ## WHEEL, createMouseMessageWParam(cData) | WHEEL_DELTA * cTimes << 16, createMouseMessageLParam(cData));\
972
+ return self;\
973
+
974
+
975
+ static VALUE ruby_mouse_scroll_wheel_forward(VARIABLE_ARGUMENTS_C);
976
+
1089
977
  /*
1090
978
  * Simulate wheeling the scroll backward in the window.
1091
979
  * @return [SpecialInputDevice::Window] self
@@ -1093,12 +981,8 @@ static VALUE ruby_mouse_x2_up(VALUE self) {
1093
981
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
1094
982
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645617.aspx Windows Dev Center - WM_MOUSEWHEEL function
1095
983
  */
1096
- static VALUE ruby_mouse_scroll_wheel_backward(VALUE self) {
1097
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1098
- HWND cHWnd = ruby___window_get_handle_code(self);
1099
- PostMessage(cHWnd, WM_MOUSEWHEEL, createMouseMessageWParam(cData) | -WHEEL_DELTA << 16,
1100
- createMouseMessageLParam(cData));
1101
- return self;
984
+ static VALUE ruby_mouse_scroll_wheel_backward(VARIABLE_ARGUMENTS_C) {
985
+ RUBY___MOUSE_SCROLL_NEGATIVE_DIRECTION(ruby_mouse_scroll_wheel_forward)
1102
986
  }
1103
987
 
1104
988
  /*
@@ -1108,14 +992,12 @@ static VALUE ruby_mouse_scroll_wheel_backward(VALUE self) {
1108
992
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
1109
993
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645617.aspx Windows Dev Center - WM_MOUSEWHEEL function
1110
994
  */
1111
- static VALUE ruby_mouse_scroll_wheel_forward(VALUE self) {
1112
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1113
- HWND cHWnd = ruby___window_get_handle_code(self);
1114
- PostMessage(cHWnd, WM_MOUSEWHEEL, createMouseMessageWParam(cData) | WHEEL_DELTA << 16,
1115
- createMouseMessageLParam(cData));
1116
- return self;
995
+ static VALUE ruby_mouse_scroll_wheel_forward(VARIABLE_ARGUMENTS_C) {
996
+ RUBY___MOUSE_SCROLL_POSITIVE_DIRECTION()
1117
997
  }
1118
998
 
999
+ static VALUE ruby_mouse_scroll_wheel_to_right(VARIABLE_ARGUMENTS_C);
1000
+
1119
1001
  /*
1120
1002
  * Simulate wheeling the scroll to left hand side in the window.
1121
1003
  * @return [SpecialInputDevice::Window] self
@@ -1123,12 +1005,9 @@ static VALUE ruby_mouse_scroll_wheel_forward(VALUE self) {
1123
1005
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
1124
1006
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645614.aspx Windows Dev Center - WM_MOUSEHWHEEL function
1125
1007
  */
1126
- static VALUE ruby_mouse_scroll_wheel_to_left(VALUE self) {
1008
+ static VALUE ruby_mouse_scroll_wheel_to_left(VARIABLE_ARGUMENTS_C) {
1127
1009
  #ifdef MOUSEEVENTF_HWHEEL
1128
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1129
- HWND cHWnd = getHandleCode(self);
1130
- PostMessage(cHWnd, WM_MOUSEHWHEEL, createMouseMessageWParam(cData) | -WHEEL_DELTA << 16, createMouseMessageLParam(cData));
1131
- return self;
1010
+ RUBY___MOUSE_SCROLL_NEGATIVE_DIRECTION(ruby_mouse_scroll_wheel_to_right)
1132
1011
  #else
1133
1012
  rb_raise(rb_eRuntimeError, "Error! Your system does not support horizontal wheel.");
1134
1013
  #endif
@@ -1141,12 +1020,9 @@ static VALUE ruby_mouse_scroll_wheel_to_left(VALUE self) {
1141
1020
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx Windows Dev Center - PostMessage function
1142
1021
  * @see https://msdn.microsoft.com/en-us/library/windows/desktop/ms645614.aspx Windows Dev Center - WM_MOUSEHWHEEL function
1143
1022
  */
1144
- static VALUE ruby_mouse_scroll_wheel_to_right(VALUE self) {
1023
+ static VALUE ruby_mouse_scroll_wheel_to_right(VARIABLE_ARGUMENTS_C) {
1145
1024
  #ifdef MOUSEEVENTF_HWHEEL
1146
- SID_WINDOW_DATA *cData = GET_SELF_DATA_OBJECT();
1147
- HWND cHWnd = getHandleCode(self);
1148
- PostMessage(cHWnd, WM_MOUSEHWHEEL, createMouseMessageWParam(cData) | WHEEL_DELTA << 16, createMouseMessageLParam(cData));
1149
- return self;
1025
+ RUBY___MOUSE_SCROLL_POSITIVE_DIRECTION(H)
1150
1026
  #else
1151
1027
  rb_raise(rb_eRuntimeError, "Error! Your system does not support horizontal wheel.");
1152
1028
  #endif
@@ -1205,28 +1081,28 @@ VOID Init_window() {
1205
1081
  rb_define_method(specialInputDevice_window, "color_at", ruby_color_at, 2);
1206
1082
  rb_define_method(specialInputDevice_window, "capture", ruby_capture, -1);
1207
1083
  rb_define_method(specialInputDevice_window, "find_image", ruby_find_image, -1);
1208
- rb_define_method(specialInputDevice_window, "key_hold", ruby_key_hold, 1);
1209
- rb_define_method(specialInputDevice_window, "key_release", ruby_key_release, 1);
1210
- rb_define_method(specialInputDevice_window, "key_press", ruby_key_press, 1);
1084
+ rb_define_method(specialInputDevice_window, "key_hold", ruby_key_hold, -1);
1085
+ rb_define_method(specialInputDevice_window, "key_release", ruby_key_release, -1);
1086
+ rb_define_method(specialInputDevice_window, "key_press", ruby_key_press, -1);
1211
1087
  rb_define_method(specialInputDevice_window, "mouse_move_relatively", ruby_mouse_move_relatively, 2);
1212
1088
  rb_define_method(specialInputDevice_window, "mouse_move_to", ruby_mouse_move_to, 2);
1213
- rb_define_method(specialInputDevice_window, "mouse_left_click", ruby_mouse_left_click, 0);
1089
+ rb_define_method(specialInputDevice_window, "mouse_left_click", ruby_mouse_left_click, -1);
1214
1090
  rb_define_method(specialInputDevice_window, "mouse_left_down", ruby_mouse_left_down, 0);
1215
1091
  rb_define_method(specialInputDevice_window, "mouse_left_up", ruby_mouse_left_up, 0);
1216
- rb_define_method(specialInputDevice_window, "mouse_right_click", ruby_mouse_right_click, 0);
1092
+ rb_define_method(specialInputDevice_window, "mouse_right_click", ruby_mouse_right_click, -1);
1217
1093
  rb_define_method(specialInputDevice_window, "mouse_right_down", ruby_mouse_right_down, 0);
1218
1094
  rb_define_method(specialInputDevice_window, "mouse_right_up", ruby_mouse_right_up, 0);
1219
- rb_define_method(specialInputDevice_window, "mouse_middle_click", ruby_mouse_middle_click, 0);
1095
+ rb_define_method(specialInputDevice_window, "mouse_middle_click", ruby_mouse_middle_click, -1);
1220
1096
  rb_define_method(specialInputDevice_window, "mouse_middle_down", ruby_mouse_middle_down, 0);
1221
1097
  rb_define_method(specialInputDevice_window, "mouse_middle_up", ruby_mouse_middle_up, 0);
1222
- rb_define_method(specialInputDevice_window, "mouse_x1_click", ruby_mouse_x1_click, 0);
1098
+ rb_define_method(specialInputDevice_window, "mouse_x1_click", ruby_mouse_x1_click, -1);
1223
1099
  rb_define_method(specialInputDevice_window, "mouse_x1_down", ruby_mouse_x1_down, 0);
1224
1100
  rb_define_method(specialInputDevice_window, "mouse_x1_up", ruby_mouse_x1_up, 0);
1225
- rb_define_method(specialInputDevice_window, "mouse_x2_click", ruby_mouse_x2_click, 0);
1101
+ rb_define_method(specialInputDevice_window, "mouse_x2_click", ruby_mouse_x2_click, -1);
1226
1102
  rb_define_method(specialInputDevice_window, "mouse_x2_down", ruby_mouse_x2_down, 0);
1227
1103
  rb_define_method(specialInputDevice_window, "mouse_x2_up", ruby_mouse_x2_up, 0);
1228
- rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_backward", ruby_mouse_scroll_wheel_backward, 0);
1229
- rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_forward", ruby_mouse_scroll_wheel_forward, 0);
1230
- rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_left", ruby_mouse_scroll_wheel_to_left, 0);
1231
- rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_right", ruby_mouse_scroll_wheel_to_right, 0);
1104
+ rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_backward", ruby_mouse_scroll_wheel_backward, -1);
1105
+ rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_forward", ruby_mouse_scroll_wheel_forward, -1);
1106
+ rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_left", ruby_mouse_scroll_wheel_to_left, -1);
1107
+ rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_right", ruby_mouse_scroll_wheel_to_right, -1);
1232
1108
  }