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.
- checksums.yaml +4 -4
- data/ext/special_input_device/_mouse.c +22 -0
- data/ext/special_input_device/_mouse.h +12 -0
- data/ext/special_input_device/_vendor__interception.c +1 -1
- data/ext/special_input_device/_vendor__interception.h +1 -1
- data/ext/special_input_device/image.c +1 -1
- data/ext/special_input_device/interception.c +11 -9
- data/ext/special_input_device/keyboard.c +109 -119
- data/ext/special_input_device/mouse.c +273 -852
- data/ext/special_input_device/window.c +228 -352
- data/lib/special_input_device/color.rb +1 -1
- data/lib/special_input_device/point.rb +61 -0
- data/lib/special_input_device/rectangle.rb +16 -7
- data/lib/yard/attribute_handler.rb +17 -0
- data/lib/yard/init_handler.rb +22 -0
- data/lib/yard/templates/default/layout/html/setup.rb +3 -0
- data/lib/yard/yard.rb +2 -0
- metadata +12 -3
|
@@ -6,49 +6,49 @@
|
|
|
6
6
|
|
|
7
7
|
#define MAXIMUM_WINDOW_NAME_LENGTH 256
|
|
8
8
|
|
|
9
|
-
#define
|
|
10
|
-
#define
|
|
11
|
-
#define
|
|
12
|
-
#define
|
|
13
|
-
#define
|
|
14
|
-
#define
|
|
15
|
-
#define
|
|
16
|
-
#define
|
|
17
|
-
#define
|
|
18
|
-
#define
|
|
19
|
-
#define
|
|
20
|
-
#define
|
|
21
|
-
#define
|
|
22
|
-
#define
|
|
23
|
-
#define
|
|
24
|
-
#define
|
|
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
|
|
27
|
+
WORD flags;
|
|
28
28
|
SHORT x;
|
|
29
29
|
SHORT y;
|
|
30
|
-
ULONGLONG
|
|
31
|
-
ULONGLONG
|
|
32
|
-
ULONGLONG
|
|
33
|
-
ULONGLONG
|
|
34
|
-
ULONGLONG
|
|
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->
|
|
39
|
+
if (cData->flags & FLAG_CONTROLS)
|
|
40
40
|
cWParam |= MK_CONTROL;
|
|
41
|
-
if (cData->
|
|
41
|
+
if (cData->flags & FLAG_SHIFTS)
|
|
42
42
|
cWParam |= MK_SHIFT;
|
|
43
|
-
if (cData->
|
|
43
|
+
if (cData->flags & FLAG_MOUSE_LEFT)
|
|
44
44
|
cWParam |= MK_LBUTTON;
|
|
45
|
-
if (cData->
|
|
45
|
+
if (cData->flags & FLAG_MOUSE_MIDDLE)
|
|
46
46
|
cWParam |= MK_MBUTTON;
|
|
47
|
-
if (cData->
|
|
47
|
+
if (cData->flags & FLAG_MOUSE_RIGHT)
|
|
48
48
|
cWParam |= MK_RBUTTON;
|
|
49
|
-
if (cData->
|
|
49
|
+
if (cData->flags & FLAG_MOUSE_X1)
|
|
50
50
|
cWParam |= MK_XBUTTON1;
|
|
51
|
-
if (cData->
|
|
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 (
|
|
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
|
|
418
|
+
HWND cWindow = ruby___window_get_handle_code(self);
|
|
420
419
|
COLORREF cColor;
|
|
421
|
-
HDC
|
|
422
|
-
POINT
|
|
423
|
-
RECT
|
|
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
|
|
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(
|
|
586
|
-
|
|
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(
|
|
635
|
-
|
|
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(
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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", ×);\
|
|
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(
|
|
785
|
-
|
|
786
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
847
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
909
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
971
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
1033
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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, ×, self);
|
|
960
|
+
|
|
961
|
+
#define RUBY___MOUSE_SCROLL_POSITIVE_DIRECTION(directionPrefix) \
|
|
962
|
+
VALUE times;\
|
|
963
|
+
SHORT cTimes;\
|
|
964
|
+
SCAN_ARGUMENTS("01", ×);\
|
|
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(
|
|
1097
|
-
|
|
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(
|
|
1112
|
-
|
|
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(
|
|
1008
|
+
static VALUE ruby_mouse_scroll_wheel_to_left(VARIABLE_ARGUMENTS_C) {
|
|
1127
1009
|
#ifdef MOUSEEVENTF_HWHEEL
|
|
1128
|
-
|
|
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(
|
|
1023
|
+
static VALUE ruby_mouse_scroll_wheel_to_right(VARIABLE_ARGUMENTS_C) {
|
|
1145
1024
|
#ifdef MOUSEEVENTF_HWHEEL
|
|
1146
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1229
|
-
rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_forward", ruby_mouse_scroll_wheel_forward,
|
|
1230
|
-
rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_left", ruby_mouse_scroll_wheel_to_left,
|
|
1231
|
-
rb_define_method(specialInputDevice_window, "mouse_scroll_wheel_to_right", ruby_mouse_scroll_wheel_to_right,
|
|
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
|
}
|