2

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

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

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

4

2 回答 2

1

我是否正确理解您想new_screenshot从热键事件处理程序中调用?如果是这样,InstallApplicationEventHandler让您在第四个参数中传递一个指向用户数据的指针。将指针传递给您的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;
}
于 2016-02-24T19:53:30.757 回答
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 Key 并使用它来截屏...

希望能帮助到你...

于 2016-02-24T21:15:23.913 回答