gpt4 book ai didi

cocoa - CGEventPost 鼠标单击后屏幕不刷新

转载 作者:行者123 更新时间:2023-12-03 16:13:19 24 4
gpt4 key购买 nike

当用户单击某个键盘键(CapsLock)时,我以编程方式生成鼠标单击。因此,我在 CapsLock 打开时按下鼠标左键,然后在关闭 CapsLock 时按下鼠标左键。

这种行为是正确的,例如,如果我将鼠标放在窗口标题栏上,单击 CapsLock,然后移动鼠标,然后单击 CapsLock,窗口会正确移动。即,我正确地“拖动”了窗口,就像在移动鼠标时按住鼠标左键一样。

但是有一个问题 - 当我移动鼠标时窗口不会移动,只有在我第二次单击 CapsLock 后它才会移动到最终位置。即在我“释放”鼠标按钮之后。

我需要做什么才能确保鼠标移动期间刷新屏幕?

有趣的是,我也迷上了

[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask

发现我的NSLog语句只在我释放鼠标左键(真正的鼠标左键)之后输出

鼠标点击代码在下面,如果需要我可以发布所有代码,没有太多..

// simulate mouse down

// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source, kCGEventLeftMouseDown, point, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseDown);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);


// simulate mouse up

// get current mouse pos
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef theEvent = CGEventCreateMouseEvent(source, kCGEventLeftMouseUp, point, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseUp);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);

最佳答案

如果您希望能够拖动窗口,问题是您还需要发布 LeftMouseDragged 事件。

只需调用beginEventMonitoring即可开始监听大写锁定键事件和鼠标移动事件。事件处理程序将根据您的需要模拟鼠标左键按下和移动。这是我博客的链接,您可以在其中下载 Xcode 4 的完整工作示例:http://www.jakepetroules.com/2011/06/25/simulating-mouse-events-in-cocoa

该示例属于公共(public)领域,您可以用它做任何您喜欢的事情。 :)

根据 Apple ( NSEvent documentation ) 的说法,需要在“系统偏好设置”>“通用访问”中选中“启用辅助设备访问”才能正常工作,但我没有选中它,这不是问题。请注意。

如果您还有任何其他问题,请告诉我,我会尽力提供帮助。

// Begin listening for caps lock key presses and mouse movements
- (void)beginEventMonitoring
{
// Determines whether the caps lock key was initially down before we started listening for events
wasCapsLockDown = CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, kVK_CapsLock);

capsLockEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSFlagsChangedMask) handler: ^(NSEvent *event)
{
// Determines whether the caps lock key was pressed and posts a mouse down or mouse up event depending on its state
bool isCapsLockDown = [event modifierFlags] & NSAlphaShiftKeyMask;
if (isCapsLockDown && !wasCapsLockDown)
{
[self simulateMouseEvent: kCGEventLeftMouseDown];
wasCapsLockDown = true;
}
else if (wasCapsLockDown)
{
[self simulateMouseEvent: kCGEventLeftMouseUp];
wasCapsLockDown = false;
}
}];

mouseMovementEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSMouseMovedMask) handler:^(NSEvent *event)
{
[self simulateMouseEvent: kCGEventLeftMouseDragged];
}];
}

// Cease listening for caps lock key presses and mouse movements
- (void)endEventMonitoring
{
if (capsLockEventMonitor)
{
[NSEvent removeMonitor: capsLockEventMonitor];
capsLockEventMonitor = nil;
}

if (mouseMovementEventMonitor)
{
[NSEvent removeMonitor: mouseMovementEventMonitor];
mouseMovementEventMonitor = nil;
}
}

-(void)simulateMouseEvent:(CGEventType)eventType
{
// Get the current mouse position
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint mouseLocation = CGEventGetLocation(ourEvent);

// Create and post the event
CGEventRef event = CGEventCreateMouseEvent(CGEventSourceCreate(kCGEventSourceStateHIDSystemState), eventType, mouseLocation, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
}

关于cocoa - CGEventPost 鼠标单击后屏幕不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com