Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Обработка нажатия клавиши PrintScreen

Автор: Bartimeus33nt10 16.8.2011, 17:08

Всем добрый день!
Написал программу, делающую скриншоты. В процессе возник вопрос: как обработать нажатие клавиши PrintScreen.
Сразу оговорю,что void keyPressEvent(QKeyEvent *event) ее не перехватывает.

Автор: alexanib 16.8.2011, 17:59

Цитата(Bartimeus33nt10 @ 16.8.2011, 18:08) *
Всем добрый день!
Написал программу, делающую скриншоты. В процессе возник вопрос: как обработать нажатие клавиши PrintScreen.
Сразу оговорю,что void keyPressEvent(QKeyEvent *event) ее не перехватывает.


http://wiki.crossplatform.ru/index.php/Сигналы_и_слоты_(Qt)

Автор: Bartimeus33nt10 16.8.2011, 18:04

Про сигналы и слоты я в курсе, вот только не пойму как они в данной ситуации могут помочь. Можешь немного поподробнее?

Автор: alexanib 16.8.2011, 19:03

Извиняюсь, не правильно понял вопрос.

Автор: RazrFalcon 16.8.2011, 19:14

Проще прогу свою запускать по нажатию PrintScreen.


Автор: Bartimeus33nt10 16.8.2011, 19:25

Проще? Я бы не сказал.
Что, неужели никто не сталкивался с перехватом этой клавиши?

Автор: ufna 16.8.2011, 20:03

а перехват то случаем не глобальный нужен? :)

Автор: Bartimeus33nt10 16.8.2011, 20:22

Глобальный, но я уже подрубил в своей программе библиотеку libqxt.
Все работает, если назначить другую клавишу.

Но нажатие PrintScreen она не хочет перехватывать ни в какую.

Автор: Bartimeus33nt10 17.8.2011, 22:38

да ладно, что НИКТО тут не знает как решить эту проблему?

Автор: Litkevich Yuriy 18.8.2011, 8:11

Цитата(Bartimeus33nt10 @ 16.8.2011, 23:22) *
Но нажатие PrintScreen она не хочет перехватывать ни в какую.
а в libqxt такая кнопка вообще есть?

Автор: Bartimeus33nt10 18.8.2011, 12:41

Цитата(Litkevich Yuriy @ 18.8.2011, 8:11) *
Цитата(Bartimeus33nt10 @ 16.8.2011, 23:22) *
Но нажатие PrintScreen она не хочет перехватывать ни в какую.
а в libqxt такая кнопка вообще есть?


хм, в каком плане? Я воспользовался QxtGlobalShortcut оттуда.

QxtGlobalShortcut hotkeyHandle;

hotkeyHandle.setShortcut(Qt::Key_Print);
hotkeyHandle.setEnabled(true);
connect(&hotkeyHandle, SIGNAL(activated()), this, SLOT(hotkeyPressed()) );




Автор: Litkevich Yuriy 18.8.2011, 13:48

Цитата(Bartimeus33nt10 @ 18.8.2011, 15:41) *
QxtGlobalShortcut hotkeyHandle;

hotkeyHandle.setShortcut(Qt::Key_Print);
hotkeyHandle.setEnabled(true);
connect(&hotkeyHandle, SIGNAL(activated()), this, SLOT(hotkeyPressed()) );
в этом коде hotkeyHandle временный (локальный) объект, он умрёт по выходу из функции.

Автор: Bartimeus33nt10 18.8.2011, 14:55

туда передается указатель на этот объект, так что ты тут ошибаешься.
но дело не в нем.


Точнее адрес передается

Автор: silver47 19.8.2011, 13:00

Цитата(Bartimeus33nt10 @ 18.8.2011, 17:55) *
Точнее адрес передается


Он как раз не ошибается. То что Вы написали, это вполне себе вероятный выстрел в ногу. Что будет выведено в результате такой программы и всегда ли вывод будет таким, каким вы ожидаете:
int* returnFive(){
    int a(5);
    return &a;
}
int main(int argc, char *argv[]){
    qDebug() << *returnFive();
}

Это этюд относительно простых переменных.

В случае с объектами же, думаю что будет вызван деструктор объекта и сигнал издавать будет просто некому.

Автор: Bartimeus33nt10 21.8.2011, 21:11

Согласен, после выхода из функции по адресу переменной хранящей пятерку будет мусор.
Но, в моем случае ситуация совершенно другая. Тут идет передача параметров функции по ссылке.
Посмотрите нижеприведенный код.


#include <iostream>
#include <conio.h>

using namespace std;

class Test
{
public:
    Test(){cout << "Create" << endl;}
    ~Test(){cout << "Destroy" << endl;}
private:
    
};

void testFunction(Test *value)
{
}

int main()
{
    Test A;
    testFunction(&A);
    return 0;
}


Сам можешь убедится, что деструктор не будет вызываться при выходе из testFunction.

А по теме у кого нибудь есть идеи?

Автор: Bartimeus33nt10 23.8.2011, 16:00

Цитата(Litkevich Yuriy @ 18.8.2011, 13:48) *
Цитата(Bartimeus33nt10 @ 18.8.2011, 15:41) *
QxtGlobalShortcut hotkeyHandle;

hotkeyHandle.setShortcut(Qt::Key_Print);
hotkeyHandle.setEnabled(true);
connect(&hotkeyHandle, SIGNAL(activated()), this, SLOT(hotkeyPressed()) );
в этом коде hotkeyHandle временный (локальный) объект, он умрёт по выходу из функции.


А, я понял, что вы имели ввиду. Нет, такого у меня не будет, потому что этот hotkeyHandle является членом класса.
Каюсь, не очень корректно привел кусок кода

Но не суть важно. Важно, что не работает перехват именно кнопки принтскрина. Если поставить любую другую клавишу - все работает.

Автор: Litkevich Yuriy 23.8.2011, 19:54

Bartimeus33nt10, не может ли быть такой ситуации: виндовоз не посылает соответствующего уведомления приложениям, считая эту кнопку "своей" ?
Ведь в виндах <PrintScreen> и <Alt>+<PrintScreen> делают снимок экрана (окна) и помещают растр в буфер обмена.

Автор: Bartimeus33nt10 23.8.2011, 20:02

Litkevich Yuriy
Воот, хорошо. Да, это и была первая у меня мысль. Вопрос в том, что это как то надо обойти. Или выдрать изображение из буфера. Но я не знаю как.

Автор: Bartimeus33nt10 3.9.2011, 19:06

Отлично, на форуме толпа народа, но ни у кого даже мыслей по этому поводу нет.

Автор: RazrFalcon 3.9.2011, 19:45

В Screenshot Example есть пример как забрать скрин экрана.

PS: если верить гуглу, кнопку PrintScreen перехватить в Qt нельзя. То есть нужно средствами системы делать скрин, а потом его забирать.
PSS: все проги что я видел, стартуют по нажатию PrintScreen - самый простой способ.

Автор: Bartimeus33nt10 4.9.2011, 17:07

В Screenshot Example этого нет.
А как запустить программу при нажатии клавиши? Там же опять будет обработка нажатия, не?

Автор: RazrFalcon 4.9.2011, 17:30

Сам запуск делается средствами самой ОС.

Автор: Litkevich Yuriy 4.9.2011, 18:30

Цитата(Bartimeus33nt10 @ 4.9.2011, 20:07) *
А как запустить программу при нажатии клавиши?
это в реестре что-то надо подкрутить, где-то попадалась статья на эту тему, но не помню где.

Автор: Bartimeus33nt10 5.9.2011, 22:39

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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)