LINUX.ORG.RU

Максим Валянский (maxcom)
Timur Bakeyev (BaT)
Oleg Drokin (green)
Artem Veremey (Tima_)
Sergey Udaltsov (svu)
Shaman007 (Shaman007)
Тёма (JB)
Михаил (anonymous_incognito)
Kirill A. Korinskiy (catap)
Ben Aceler (Aceler)
Dimitri Sokolyuk (beastie)
Антон Симонов (riki)
Василий (mono)
true_admin (true_admin)
Павел (leave)
Valdos Nevermind Sine (DoctorSinus)
Сергей Попов (Pinkbyte)

Кастуй.

cipher ★★★★★
()
Ответ на: комментарий от J
#include <QGuiApplication>
#include <QClipboard>
#include <QThread>
#include <QDebug>
#include <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);

    QClipboard *cb = qApp->clipboard();

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, YES);
    CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
    CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, NO);

    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown);
    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp);

    CFRelease(saveCommandUp);
    CFRelease(saveCommandDown);
    CFRelease(source);

    QThread::sleep(5);

    qDebug() << "SELECTED TEXT: " << cb->text(QClipboard::Clipboard);

    return a.exec();
}
flareguner
() автор топика
Ответ на: комментарий от flareguner

Однострочник тоже был с исходником.

J ★★★★
()
Ответ на: комментарий от waker

Там код, который эмулирует нажатие клавиш Command+C, а потом забирает из буфера выделенный текст и выводит его в консоль. Всё.

flareguner
() автор топика
Ответ на: комментарий от flareguner

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

waker ★★★★★
()
Ответ на: комментарий от waker

Вот архив с исходником: http://rghost.ru/51876780

Запустишь бинарник, у тебя есть 5 секунд чтобы выделить текст и дождаться окончания sleep, потом оно должно выдать выделенный текст на консоль. Отпиши потом сработало или нет.

flareguner
() автор топика
Ответ на: комментарий от flareguner

я думал не доживу до этого момента

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Упс, в Qt4 он ещё protected... Значит надо Qt5 или использовать какой-нибудь другой sleep

flareguner
() автор топика
Ответ на: комментарий от flareguner

вынеси код objc в отдельный файл, с расширением .m (или .mm), сделай отдельную функцию, и ее вызывай из своего кода как обычно.

может быть и просто все в .mm сработает, но не знаю будет ли moc жрать .mm файлы автоматически.

waker ★★★★★
()
Ответ на: комментарий от flareguner

Вот этот твой оригинальный кусок в тестовом проекте привязал к кнопке. При нажатии корректно эмулируется cmd-c, а если рядом кинуть NSTextField, то даже не пикает, а копирует его содержимое.

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, YES);
    CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
    CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, NO);

    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown);
    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp);

    CFRelease(saveCommandUp);
    CFRelease(saveCommandDown);
    CFRelease(source);
Правда непонятно, зачем ты создаешь соурс, если в мануле сказано либо передать от другого ивента, либо NULL. При отжатии кнопки хз нужно ли указывать модификатор, ты не указываешь.
    CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, YES);
    CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown);
    CFRelease(saveCommandDown);

    CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, NO);
    CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp);
    CFRelease(saveCommandUp);
От Objective-C-зависимостей в теории можно избавиться, указывая CoreFoundation/CoreFoundation.h и CoreGraphics/CoreGraphics.h вместо Cocoa/Cocoa.h.

Неясен только смысл затеи, проще у [[[NSApplication sharedApplication] keyWindow] firstResponder]'а забрать текст напрямую, если [он isKindOfClass:NSText].

arturpub ★★
()
Ответ на: комментарий от arturpub
    NSText *fieldEditor = (id)[[[NSApplication sharedApplication] keyWindow] firstResponder];
    
    if ([fieldEditor isKindOfClass:[NSText class]])
        [fieldEditor copy:nil];

Ровно то же самое, кроме случаев, когда контрол реализует в -[copy:] копирование чего-то, кроме текста (такого в общем-то не встречал).

arturpub ★★
()
Ответ на: комментарий от flareguner

Линковать скорее всего с -framework CoreGraphics -framework CoreFoundation, раз уж так без .m-файлов хочется.

arturpub ★★
()

В общем, я бы позапускал чего тестового даже, но в душе не представляю, как готовить это ваше кутэ. Часов в 10-11 проснусь. У тебя если все еще та задача, где ты в чужой проге текст копировать хотел, то по-мойму ты не в ту сторону копаешь — CGEvent это уже после того, как событие зашло в CoreGraphics, а это уже уровень только текущего приложения (где все проще решается, без CG-мудежа). Но тебе же из фона надо было общесистемные слать вроде, чтобы потом тексты забирать, или нет?

arturpub ★★
()

Ощем вот это, выполненное с отсрочкой в 5 секунд в фоне, вызвало cmd-c у сафари, на который я переключился и выделил текст, нажав предварительно свою волшебную кнопку. Беру свои слова про application level назад.

- (IBAction)doButton:(id)sender
{
    [self performSelector:@selector(doCopy:) withObject:nil afterDelay:5.0];
}

- (void)doCopy:(id)sender
{
    ProcessSerialNumber psn;
    GetFrontProcess(&psn);
    
    CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, YES);
    CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
    CGEventPostToPSN(&psn, saveCommandDown);
    
    CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, NO);
    CGEventSetFlags(saveCommandUp, kCGEventFlagMaskCommand);
    CGEventPostToPSN(&psn, saveCommandUp);
    
    CFRelease(saveCommandUp);
    CFRelease(saveCommandDown);
}

arturpub ★★
()
Ответ на: комментарий от alexmaru

Ты не модератор. Вот когда станешь, тогда и будем кастовать в теме про мак.

cipher ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.