带有平台API的C ++ Global Hotkeys

时间:2016-02-24 19:41:00

标签: c++ qt hotkeys global-hotkey

我正在使用C ++ / Qt在Windows,OSX和Linux上截取屏幕截图的应用程序。现在我需要设置全局热键,因此用户可以在应用程序在后台运行时截取屏幕截图。我尝试使用Qxt和UGlobalHotkey,它们都是Qt库,但它们似乎都不起作用。

我尝试使用Carbon (tutorial)为OSX实现它,但我需要调用一个类成员函数,它不起作用。有人可以给我一个例子吗?您可以找到我的代码here。我需要调用的函数是new_screenshot()。

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

2 个答案:

答案 0 :(得分:1)

我是否理解您要从热键事件处理程序中调用# Init $ns = "root\Microsoft\SqlServer\ReportServer\RS_$sqlInstanceName\v11\Admin" $RSObject = Get-WmiObject -class "MSReportServer_ConfigurationSetting" -namespace "$ns" # Set service account $builtInServiceAccount = "Builtin\NetworkService" $useBuiltInServiceAccount = $true $RSObject.SetWindowsServiceIdentity($useBuiltInServiceAccount, $builtInServiceAccount, "") | out-null # Set virtual directory URLs $HTTPport = 80 $RSObject.RemoveURL("ReportServerWebService", "http://+:$HTTPport", 1033) | out-null $RSObject.RemoveURL("ReportManager", "http://+:$HTTPport", 1033) | out-null $RSObject.SetVirtualDirectory("ReportServerWebService", "ReportServer", 1033) | out-null $RSObject.SetVirtualDirectory("ReportManager", "Reports", 1033) | out-null $RSObject.ReserveURL("ReportServerWebService", "http://+:$HTTPport", 1033) | out-null $RSObject.ReserveURL("ReportManager", "http://+:$HTTPport", 1033) | out-null # Restart service $serviceName = $RSObject.ServiceName Restart-Service -Name $serviceName -Force ?如果是这样,new_screenshot允许您在第4个参数中传递指向用户数据的指针。将指针传递给InstallApplicationEventHandler实例(基于教程中的代码):

MainWindow

然后你可以在事件处理程序中使用它。

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

答案 1 :(得分: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);
            }
        }
    } 

您可以使用该代码注册自己的热键并使用它来截取屏幕截图...

希望它有所帮助...