Как Получить / Сообщение Клавиатура в масштабе всей системы / События от нажатия мыши в соответствии с Mac OS X?

Вы почти на месте:

  1. Вам необходимо .PasteSpecial Transpose:=True перенести свои данные.
  2. Я вставил обработку ошибок, чтобы пользователь мог нажать кнопку отмены.
  3. Я переименовал ваши переменные, поскольку range1 не является хорошим именем переменной. Использование значимых имен значительно облегчает чтение и поддержку вашего кода.

Итак, вы получите…

Option Explicit

Public Sub main()
    On Error Resume Next 'don't error on cancel button
    Dim rngSource As Range
    Set rngSource = Application.InputBox("Select src Range", "select src range", Type:=8) 'type 8 = range

    Dim rngDest As Range
    Set rngDest = Application.InputBox("select des range", "select des range", Type:=8)
    On Error GoTo 0 're-activate error reporting

    If Not rngSource Is Nothing And Not rngDest Is Nothing Then
        rngSource.Copy
        rngDest.PasteSpecial Transpose:=True
    End If
End Sub

Если вы хотите вставить только значения без форматирования, используйте…

rngDest.PasteSpecial Paste:=xlPasteValues, Transpose:=True

См. Range.PasteSpecial метод и Перечисление xlPasteType для получения дополнительной информации.

5
задан Robert S. 23 February 2009 в 23:51
поделиться

3 ответа

Первая вещь, которую я скажу Вам, состоит в том, что Вы не МОЖЕТЕ сделать этого без пользователя, разрешающего поддержку вспомогательных устройств в панели управления доступности. Это - некоторая безопасность, встроенная в OSX.

Вот отрывок кода, который я использую в одном из моих приложений, чтобы сделать это:

//this method calls a carbon method to attach a global event handler
- (void)attachEventHandlers
{
    //create our event type spec for the keyup
    EventTypeSpec eventType;
    eventType.eventClass = kEventClassKeyboard;
    eventType.eventKind = kEventRawKeyUp;

    //create a callback for our event to fire in
    EventHandlerUPP handlerFunction = NewEventHandlerUPP(globalKeyPress);

    //install the event handler
    OSStatus err = InstallEventHandler(GetEventMonitorTarget(), handlerFunction, 1, &eventType, self, NULL);

    //error checking
    if( err )
    {
        //TODO: need an alert sheet here
        NSLog(@"Error registering keyboard handler...%d", err);
    }

    //create our event type spec for the mouse events
    EventTypeSpec eventTypeM;
    eventTypeM.eventClass = kEventClassMouse;
    eventTypeM.eventKind = kEventMouseUp;

    //create a callback for our event to fire in
    EventHandlerUPP handlerFunctionM = NewEventHandlerUPP(globalMousePress);

    //install the event handler
    OSStatus errM = InstallEventHandler(GetEventMonitorTarget(), handlerFunctionM, 1, &eventTypeM, self, NULL);

    //error checking
    if( errM )
    {
        //TODO: need an alert sheet here
        NSLog(@"Error registering mouse handler...%d", err);
    }
}

Вот пример метода обратного вызова, который я использую:

OSStatus globalKeyPress(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) 
{
    NSEvent *anEvent = [NSEvent eventWithEventRef:theEvent];
    NSEventType type = [anEvent type];
    WarStrokerApplication *application = (WarStrokerApplication*)userData;

    //is it a key up event?
    if( type == NSKeyUp)
    {
        //which key is it?
        switch( [anEvent keyCode] )
        {
            case NUMERIC_KEYPAD_PLUS: 
                //this is the character we are using for our toggle
                //call the handler function
                [application toggleKeyPressed];
                break;

                //Comment this line back in to figure out the keykode for a particular character                
            default:
                NSLog(@"Keypressed: %d, **%@**", [anEvent keyCode], [anEvent characters]);
                break;
        }
    }

    return CallNextEventHandler(nextHandler, theEvent);
}
10
ответ дан 18 December 2019 в 12:02
поделиться

Для последней части, отправляя события, используют методы CGEvent, предоставленные в ApplicationServices/ApplicationServices.h

Вот функция в качестве примера для перемещения мыши в указанное абсолютное местоположение:

#include <ApplicationServices/ApplicationServices.h>

int to(int x, int y)
{
    CGPoint newloc;
    CGEventRef eventRef;
    newloc.x = x;
    newloc.y = y;

    eventRef = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newloc,
                                        kCGMouseButtonCenter);
    //Apparently, a bug in xcode requires this next line
    CGEventSetType(eventRef, kCGEventMouseMoved);
    CGEventPost(kCGSessionEventTap, eventRef);
    CFRelease(eventRef);

    return 0;
}
4
ответ дан 18 December 2019 в 12:02
поделиться

Для ответвления событий от нажатия мыши см. http://osxbook.com/book/bonus/chapter2/altermouse/

Я не проверил это под 10,5 Leopard, но на 10,4 они работают.

1
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: