带有平台 API 的 C++ 全局热键

C++ Global Hotkeys with platform APIs

我正在开发一个应用程序,用于在 C++/Qt 中对 Windows、OSX 和 Linux 进行屏幕截图。现在我需要设置全局热键,以便用户可以在应用程序在后台 运行 时截屏。我尝试使用 Qxt 和 UGlobalHotkey,它们都是 Qt 库,但它们似乎都不起作用。

我尝试用 Carbon (tutorial), but I need to call a class member function, which just doesn't work. Could someone provide me with an example? You can find my code here 为 OSX 实现它。我需要调用的函数是 new_screenshot().

或者还有其他方法可以达到这样的目的吗?我真的需要我的应用程序从后台截取屏幕截图,否则它就没用了(是的,我应该在一开始就实现它,看看它是否有效)。每个平台都有一个单独的客户端(Cocoa Swift OSX,GTK Linux,C# 客户端 Windows)可能会更好吗?这几天我经常在想这个问题。

我的理解是否正确,您想从热键事件处理程序调用 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;
}

我过去用 MFC 和 WIN32 做过一些事情 API...所以它只适用于 Windows...但是按 ALT+F10 可以 hide/show一个window...

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");

    }   
}

基本上这个代码 activates/deactivates 热键 ALT+F10,一旦它激活你可以 hide/unhide a 运行 window 在系统上通过设置鼠标指针指向 window 并按 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 Key并使用它来截屏...

希望对您有所帮助...