我正在使用C ++ / Qt在Windows,OSX和Linux上截取屏幕截图的应用程序。现在我需要设置全局热键,因此用户可以在应用程序在后台运行时截取屏幕截图。我尝试使用Qxt和UGlobalHotkey,它们都是Qt库,但它们似乎都不起作用。
我尝试使用Carbon (tutorial)为OSX实现它,但我需要调用一个类成员函数,它不起作用。有人可以给我一个例子吗?您可以找到我的代码here。我需要调用的函数是new_screenshot()。
或者还有其他方法来实现这样的目标吗?我真的需要我的应用程序从后台截取屏幕截图,否则它很没用(是的,我应该在一开始就实现它,看它是否有效)。为每个平台建立一个单独的客户端(OSX的Cocoa Swift,Linux的GTK,Windows的C#客户端)可能更好吗?过去几天我经常想到这一点。
答案 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);
}
}
}
您可以使用该代码注册自己的热键并使用它来截取屏幕截图...
希望它有所帮助...