qt — глобальные горячие клавиши C ++ с API-интерфейсами платформы

Я работаю над приложением для снятия скриншотов в Windows, OSX и Linux на C ++ / Qt. Теперь мне нужно установить глобальные горячие клавиши, чтобы пользователь мог делать снимки экрана, когда приложение работает в фоновом режиме. Я попытался с Qxt и UGlobalHotkey, которые являются библиотеками Qt, но ни одна из них, похоже, не работала.

Я пытался реализовать это для OSX с Carbon (руководство), но мне нужно вызвать функцию-член класса, которая просто не работает. Может ли кто-нибудь привести мне пример? Вы можете найти мой код Вот. Функция, которую мне нужно вызвать, это new_screenshot ().

Или есть другой способ добиться чего-то подобного? Мне действительно нужно, чтобы мое приложение делало снимок экрана с фона, в противном случае оно довольно бесполезно (да, я должен был бы реализовать его в самом начале, чтобы посмотреть, работает ли он вообще). Может быть, было бы лучше иметь отдельный клиент для каждой платформы (Cocoa Swift для OSX, GTK для Linux, C # клиент для Windows)? Я часто думал об этом последние несколько дней.

2

Решение

Я правильно понимаю, что вы хотите позвонить new_screenshot из обработчика событий горячей клавиши? Если так, InstallApplicationEventHandler позволяет передавать указатель на пользовательские данные в 4-м аргументе. Передайте указатель на ваш MainWindow экземпляр (на основе кода из учебника):

MainWindow *mainWindow = ... // get main window somehow
InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,mainWindow,NULL);

Затем вы можете использовать его в обработчике событий.

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)
{
//Do something once the key is pressed
static_cast<MainWindow*>(userData)->new_screenshot();
return noErr;
}
1

Другие решения

Я сделал что-то в прошлом с MFC и WIN32 API …. так что это работает только на Windows … но нажав ALT+F10 смог скрыть / показать окно …

void CWinHideDlg::OnButtonActive()
{
CString tmp;
GetDlgItemText(IDC_BUTTON_ACTIVE,tmp);
if(0 == strcmp(tmp.GetBuffer(tmp.GetLength()),"Activate"))
{
m_myAtom=GlobalAddAtom("MY_GLOBAL_HOT_HIDE_KEY");
int err=RegisterHotKey(this->GetSafeHwnd(),m_myAtom,MOD_ALT,VK_F10);
SetDlgItemText(IDC_BUTTON_ACTIVE,"Stop");
CButton *pBtn = (CButton *)GetDlgItem(IDC_BUTTON_UNHIDE);
pBtn->EnableWindow(TRUE);
SetDlgItemText(IDC_STATIC_INFO,"Set the mouse over the window \nand press ALT + F10 to hide it...");
}
else
{
UnregisterHotKey(this->GetSafeHwnd(),m_myAtom);
GlobalDeleteAtom(m_myAtom);
CButton *pBtn = (CButton *)GetDlgItem(IDC_BUTTON_UNHIDE);
pBtn->EnableWindow(FALSE);
SetDlgItemText(IDC_BUTTON_ACTIVE,"Activate");

}
}

В основном этот код активирует / деактивирует горячую клавишу ALT+F10После активации вы можете скрыть / показать работающее окно в системе, установив указатель мыши на окно и нажав ALT+F10

Это из WindowProc функция:

if(message == WM_HOTKEY)
{
CString tmp;
POINT pc;
GetCursorPos(&pc);if(GetAsyncKeyState(VK_F10))
{
HWND hwnd=::WindowFromPoint(pc);
if(hwnd)
{
tmp.Format("%08Xh",hwnd);
m_HideWins.InsertString(m_HideWins.GetCount(),tmp);
::ShowWindow(hwnd,SW_HIDE);
}
}
}

Вы можете использовать код, чтобы зарегистрировать свой собственный ключ HOT и использовать его, чтобы сделать снимок экрана …

Надеюсь, поможет…

1

По вопросам рекламы [email protected]