带有平台 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并使用它来截屏...
希望对您有所帮助...
我正在开发一个应用程序,用于在 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并使用它来截屏...
希望对您有所帮助...