小编Jod*_*ins的帖子

小牛队中的CGEventTapCreateForPSN +(不推荐使用GetCurrentProcess)

我正在使用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)

macos cocoa cgeventtap osx-mavericks osx-yosemite

15
推荐指数
1
解决办法
758
查看次数

How do I get printf-like warnings with variadic arguments?

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, …

c++ gcc variadic-functions gcc-warning c++17

6
推荐指数
0
解决办法
293
查看次数

如何使用 Boost.MP11 避免不必要的实例化

我使用自己的 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)

c++ template-meta-programming boost-mp11

5
推荐指数
0
解决办法
262
查看次数

OSX:如何允许用户在自动布局下调整窗口大小?

我有一个NSWindow,有一些视图,与自动布局约束相连.

窗口看起来像这样......

Label - TextView - Label - TextView - Label - DatePicker

Label - TextView - Label - PopUp - Label - PopUp
Run Code Online (Sandbox Code Playgroud)

弹出窗口的数据是通过绑定到核心数据获得的,因此直到运行时才知道这些值.我希望这些控件调整大小以适应数据库中的值.

从表面上看,一切似乎都很好.但是,如果我在弹出控件中以一个非常长的字符串结束,那么该控件的大小会导致窗口的大小扩展.

我希望大小是动态的,并根据数据的值进行更改,但我希望约束限制为窗口的大小.

但是,我希望用户能够调整窗口大小,如果他们想让它更宽.我只希望用户调整窗口大小(窗口大小将自动保存和恢复).

如果我在窗口的主视图上设置拥抱值,我会得到它,但这似乎阻止用户也能够调整窗口的大小.如果我降低控件约束的优先级,我不会得到我想要的大小和位置.

所以,基本上,我希望控件随窗口大小的变化而变化,但我不希望窗口大小发生变化,除非用户更改它.我怎样才能实现这一目标?

谢谢!

macos cocoa autolayout

2
推荐指数
1
解决办法
962
查看次数