我正在使用CGEventTapCreateForPSN陷阱和过滤我的应用程序的键.我对拦截其他应用程序的事件不感兴趣.我很确定一个事件水龙头太重了我的目的,但我一直无法找到更好的方法,并使用事件水龙头工作.
具体来说,这段代码可以满足我的需求.
GetCurrentProcess(&psn);
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
Run Code Online (Sandbox Code Playgroud)
并且我的回调处理得很好,事件只从当前应用程序中截获.
不幸的是,ProcessSerialNumber从10.9开始,所有获得当前的方法都已被弃用.有一种旧的标准方法可以ProcessSerialNumber在同一个进程中传递给其他例程,这个初始化...
ProcessSerialNumber psn = { 0, kCurrentProcess };
Run Code Online (Sandbox Code Playgroud)
但是在打电话时这不起作用CGEventTapCreateForPSN.头文件docs表示尽可能多,并且以下代码段NULL作为确认返回.
ProcessSerialNumber psn = { 0, kCurrentProcess };
CFMachPortRef eventTap = CGEventTapCreateForPSN(
&psn,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown)
| CGEventMaskBit(kCGEventKeyUp),
eventCallback,
userInfo);
Run Code Online (Sandbox Code Playgroud)
我可以使用,CGEventTapCreate但它点击整个主机,然后我需要过滤任何不指向我的应用程序的东西,并且CGEventTapProxy是不透明的,我不知道如何使用它来确定它是否是我的应用程序.
我已经验证了已弃用的代码仍然有效,但Apple可以随时决定将其删除.那么,有没有人知道我应该怎样继续CGEventTapCreateForPSN在小牛队以及其他地方打电话?
谢谢!
UPDATE
在10.11(我认为那是El Capitan),增加了一个新功能.虽然它没有文档,但它的签名几乎完全相同CGEventTapCreateForPSN.
CFMachPortRef CGEventTapCreateForPSN(
void *processSerialNumber,
CGEventTapPlacement place,
CGEventTapOptions options,
CGEventMask eventsOfInterest,
CGEventTapCallBack callback, …Run Code Online (Sandbox Code Playgroud) If I compile g++ with -Wformat on the following code, I get a warning, as expected.
int main(int argc, char * argv[])
{
printf("argc %lld\n", argc);
}
Run Code Online (Sandbox Code Playgroud)
However, if compile the following code, I get no warning.
template <typename... Ts>
void foo(char const * s, Ts && ... ts)
{
printf(s, std::forward<Ts>(ts)...);
}
int main(int argc, char * argv[])
{
foo("argc %lld\n", argc);
}
Run Code Online (Sandbox Code Playgroud)
I was a bit surprised, but I thought maybe the references were throwing off the detection, …
我使用自己的 TMP 库已经有一段时间了。但是,我想开始使用Boost.MP11. 界面非常漂亮,为了给自己一些学习它的动力,我在编译时尽可能多地使用Boost.MP11.
然而,有些事情是我必须做的,但我不喜欢。我回去清理了一些东西,有一个地方我仍然有点困惑,那就是如何防止不必要的实例化。我确信使用 mp_valid 是可行的方法,但我可以使用一些指导。
例如,考虑以下push_heap, using的实现Boost.MP11(我将其作为实现 Dijkstra 算法以应对挑战之一的一部分来实现)。
为了使我想要实现的目标变得明显,即仅当模板为真时才实例化模板,它有点冗长。
我一定是误解了一些东西Boost.MP11,所以我想看到一个优雅的Boost.MP11实现push_heap。
template <typename IndexT>
using parent = mp_constant<(IndexT::value - 1) / 2>;
template <typename ListT, typename IndexT> struct BubbleUp;
template <
typename ListT,
typename IndexT,
typename CondT = mp_less<
mp_at<ListT, parent<IndexT>>,
mp_at<ListT, IndexT>>>
struct BubbleUpImpl
: BubbleUp<
mp_replace_at<
mp_replace_at<ListT, IndexT, mp_at<ListT, parent<IndexT>>>,
parent<IndexT>,
mp_at<ListT, IndexT>>,
parent<IndexT>>
{ };
template <typename ListT, typename …Run Code Online (Sandbox Code Playgroud) 我有一个NSWindow,有一些视图,与自动布局约束相连.
窗口看起来像这样......
Label - TextView - Label - TextView - Label - DatePicker
Label - TextView - Label - PopUp - Label - PopUp
Run Code Online (Sandbox Code Playgroud)
弹出窗口的数据是通过绑定到核心数据获得的,因此直到运行时才知道这些值.我希望这些控件调整大小以适应数据库中的值.
从表面上看,一切似乎都很好.但是,如果我在弹出控件中以一个非常长的字符串结束,那么该控件的大小会导致窗口的大小扩展.
我希望大小是动态的,并根据数据的值进行更改,但我希望约束限制为窗口的大小.
但是,我希望用户能够调整窗口大小,如果他们想让它更宽.我只希望用户调整窗口大小(窗口大小将自动保存和恢复).
如果我在窗口的主视图上设置拥抱值,我会得到它,但这似乎阻止用户也能够调整窗口的大小.如果我降低控件约束的优先级,我不会得到我想要的大小和位置.
所以,基本上,我希望控件随窗口大小的变化而变化,但我不希望窗口大小发生变化,除非用户更改它.我怎样才能实现这一目标?
谢谢!
c++ ×2
cocoa ×2
macos ×2
autolayout ×1
boost-mp11 ×1
c++17 ×1
cgeventtap ×1
gcc ×1
gcc-warning ×1
osx-yosemite ×1