2017-03-15 4 views
1

私は現在、iOSデバイスとトラックパッドとしてiOSデバイスを機能させるMacOSのクロスプラットフォームアプリケーションを開発中です。Cocoaアプリケーション:プログラムでスクロールしますか?

CGDisplayMoveCursorToPointを使用すると、画面上でカーソルを移動できます。魅力のように動作します。 (すなわち、MacOSの上で実行されている)「ホスト」アプリケーションのコードのこの作品で は、私は、マウスのクリック操作を行うことができます。

let currentPosition = foo() // call to my helper function 
          // that translates NSEvent.mouseLocation() 
let downEvent = CGEvent(
    mouseEventSource: nil, 
    mouseType: .leftMouseDown, 
    mouseCursorPosition: currentPosition, 
    mouseButton: .left 
) 
let upEvent = CGEvent(
    mouseEventSource: nil, 
    mouseType: .leftMouseUp, 
    mouseCursorPosition: currentPosition, 
    mouseButton: .left 
) 
downEvent?.post(tap: CGEventTapLocation.cghidEventTap) 
upEvent?.post(tap: CGEventTapLocation.cghidEventTap) 

これまでのところ、とても良いです。

今、iOSデバイスで2本の指を使ってスクロールを実装したいと考えています。問題は、iOSとmacOS(btw、PeerTalkは素晴らしい)の間の通信ではなく、ホスト上でスクロールイベントを引き起こすことができないという事実です。まず

は、私はこのような何か試してみました:

let eventSource = CGEventSource(stateID: .hidSystemState) 
let event = CGEvent(
    mouseEventSource: eventSource, 
    mouseType: .scrollWheel, 
    mouseCursorPosition: currentPosition, 
    mouseButton: .left 
) 

を残念ながら、eventは常にnilある、と私は理由を理解することはできません。イベントを作成するときに

NSEvent.mouseEvent(
    with: NSEventType.scrollWheel, 
    location: NSPoint(x: 671.0, y: 568.0), 
    modifierFlags: .init(rawValue: 0), 
    timestamp: 198223.19430632601, 
    windowNumber: 14389, 
    context: nil, 
    eventNumber: 0, 
    clickCount: 1, 
    pressure: 1.0 
) 

しかし、私のアプリケーションのクラッシュ:私は試してみたかった他の方法は、この(はい、私はテスト目的のために、私は世界のイベントリスナーからもらった、ハードコードされた値を使用しています)です

スクロール機能をどのように達成することができますか?前もって感謝します!

答えて

0

I a)はブリッジヘッダ使用

ことによってそれを解決:

#ifndef Header_h 
#define Header_h 
void createScrollWheelEvent(); 
#endif /* Header_h */ 

B)昔ながらCでイベントを作成する関数を書く:

#include <stdio.h> 
#include <ApplicationServices/ApplicationServices.h> 

void createScrollWheelEvent() { 
    CGEventRef upEvent = CGEventCreateScrollWheelEvent(
     NULL, 
     kCGScrollEventUnitPixel, 
     2, 1, 1); 
    CGEventPost(kCGHIDEventTap, upEvent); 
    CFRelease(upEvent); 
} 

c)をとスウィフトコードから直接呼び出す:

createScrollWheelEvent() 

機能が可変であるため、SwiftでCGEventCreateScrollWheelEventを使用することはできません。コードは明らかに微調整が必​​要ですが、誰かにこの記事をどのように解決するかという考えを抱かせるべきです。

//編集

私はまたCGDisplayMoveCursorToPointが "正しい" ではないことに気づきました。はい、それはカーソルを移動しますが、ドックのアイコンにカーソルを置くと、アプリケーション名のポップアップは表示されません。したがって、カーソルを移動するにはCGEventに切り替えました。

関連する問題