問題タブ [cgeventtap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2241 参照

events - イベント タップ: CGEventPost、kCGSessionEventTap、kCGAnnotatedSessionEventTap、CGEventTapPostEvent によるさまざまな結果

イベント タップからイベントを投稿する際に厄介な問題が発生しています。kCGHIDEventTap で NSSystemDefined をタップし、イベントを新しいイベントに置き換えます。私が直面している問題は、イベントの投稿方法によっては、一部のアプリケーションでしか見られないことです。私のテスト アプリケーションは、Opera、Firefox、Quicksilver、および Xcode です。イベント タップ コールバック内で試したさまざまな手法と結果を以下に示します。各アプリからのアクション (「正しい応答」) を期待しています。「システム ビープ」とは、そのキーに何もバインドされていないシステム サウンドを意味します。

  1. 新しいイベントを作成し、コールバックから返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音

  2. 新しいイベントを作成し、CGEventPost で kCGSessionEventTap にポストし、null を返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音

  3. 新しいイベントを作成し、CGEventPost で kCGAnnotatedSessionEventTap に投稿し、null を返します。Opera: 正しい応答、Firefox: 正しい応答、Quicksilver: 無応答/システム ビープ音、Xcode: 無応答/システム ビープ音

  4. 新しいイベントを作成し、CGEventTapPostEvent で投稿し、null を返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音

  5. 新しいイベントを作成し、CGEventPost で kCGSessionEventTap に投稿し、新しいイベントを返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音

  6. 新しいイベントを作成し、CGEventPost で kCGAnnotatedSessionEventTap に投稿し、新しいイベントを返します。Opera: 正しい応答とシステム ビープ音、Firefox: 正しい応答とシステム ビープ音、Quicksilver: 正しい応答とシステム ビープ音、Xcode: 応答なし/2 回のシステム ビープ音

  7. 新しいイベントを作成し、CGEventTapPostEvent で投稿し、新しいイベントを返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音

(6) が最適ですが、ユーザーは、正しい応答に対する余分なシステム ビープ音について不満を漏らしています。これは、イベントの二重投稿が原因であると推測しています。他の組み合わせを試してみるか、他にどこを見ればよいかわかりません。誰でもガイダンスを提供できますか?コールバックからイベントを返すことと、注釈付きタップに投稿することの両方を行わずに結果を取得する方法はありますか?

長い質問で申し訳ありません。私はたくさんの実験をしてきました。

前もって感謝します


更新: これは、イベント タップを作成するために使用するコードです。

0 投票する
2 に答える
9750 参照

objective-c - CGEventCreateMouseEvent()を使用してダブルクリックを実行する

次のコードを使用して、マウスのクリックをシミュレートしています。

基本的に同じコードを使用して、以下を変更することでコントロールクリック(右クリック)を実行できます。

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

それぞれの「正しい」イベントに。関数は次のようになります。

しかし、ダブルクリックはどうですか?2回の左クリックを送信し、PostMouseEvent()を2回続けて呼び出してみましたが、うまくいきませんでした。ダブルクリックをどのように実行しますか?

ありがとう!

0 投票する
2 に答える
1321 参照

macos - 複数の文字で CGEventKeyboardSetUnicodeString を使用するにはどうすればよいですか?

イベントタップを使用して、文字変換で入力されたイディッシュ語をリッスンし、結果をヘブライ文字で投稿する OS X プログラムを作成しようとしています。私がしなければならないことをテストするために、非常に短いプログラムを作成しました: http://pastie.org/791398

そのままで、プログラムは入力されたすべての 'q' を 'w' に正常に置き換えます。

しかし、複数の文字列を投稿するにはどうすればよいでしょうか。たとえば、誰かが 'sh' と入力した場合、('s' だけのために投稿された文字を削除するために) バックスペースを投稿してから、'sh' に対応する文字を投稿する必要があります。ただし、このコードではバックスペースのみがポストされます。

これらが基本的な質問である場合は申し訳ありません。見つけたすべてのドキュメントを読みましたが、すべてを理解していない可能性があります。また、私がこれについて完全に間違った方法で行っている可能性もあります。

0 投票する
2 に答える
1472 参照

objective-c - CGEvent を PSN に投稿するときの奇妙な動作

編集 - これについて多くの意見が得られないため、ここにスキニーがあります。キーボード イベントを PSN に投稿しています。次に、別のウィンドウに切り替えて、さらにいくつかのイベントを投稿し (今回は tat セッション レベル)、最初のウィンドウに戻ります。PSN への投稿を再開しても、何も起こりません。マウスまたはスクロール ホイールを動かすまで。これはなぜですか? また、どうすれば回避できますか (修正しない場合)?

オリジナル - いくつかのキーボード イベントを PSN に投稿するループを設定すると、最初の起動時以外は正常に動作することがわかりました。イベントは、マウスで手動で何かをしたときにのみ投稿されるようです-わずかに動かしただけでも。詳細はこちらです。

外部アプリケーションにはテキスト行のリスト ボックスがあり、コピー コマンドを投稿して (そしてペーストボードをチェックして) 読んでいます。残念ながら、これがこのテキストを取得する唯一の方法です。

ときどき、アプリケーションがリストからフォーカスを外しますが、これは私が検出できます。これが発生した場合、フォーカスを戻す最も確実な方法は、マウス イベントを送信してリストの真上にあるテキスト フィールドをクリックし、「タブ」キーボード イベントを送信してフォーカスをリストに移動することです。

そのため、起動時にループが正常に実行され、リストを下にスクロールしてテキストをコピーします。フォーカスが移動すると、それが正常に検出され、イベントが送信されてフォーカスがリストに戻ります。しかし、何も起こらないようです。ループはフォーカスが変更されたことを検出し続けますが、マウスを動かしたときにのみイベントが機能します。または、スクロール ホイールを使用することもできます。変。

これが初めて発生すると、問題なく動作します。フォーカスが移動するたびに、何もしなくても PSN イベントが元に戻ります。

ループで実行されるコードは次のとおりです-動作することが確認されています:

そして、ここでフォーカスを切り替え、これも機能します (最初に必要な場合を除く)。

0 投票する
1 に答える
1074 参照

quartz-graphics - CGEventTap で capslock をブロックできない

Capslock のプレスをグローバルにインターセプトしてブロックするために、Quartz CGEventTap を使用しています (代わりに何か役に立つことをさせるため)。capslock の押下を検出することに成功しましたが、これまでのところそれらをブロックできませんでした。私のコード(このスタックオーバーフローの回答に由来する)は次のようなものです:

私が正しく NULL を返すことを理解していれば、キープレスの伝播を効果的にブロックするはずです。実際、「通常の」キーアップおよびキーダウン イベントでも同様です。ただし、capslock は関係なくトグルします。それはなぜですか?私は間違った仮定をしていますか? および/または、目標を達成するためにどうすれば別のことを行うことができますか?

ありがとう、

ソー

0 投票する
1 に答える
1113 参照

macos - CGEventCreateKeyboardEvent on Desktop vs MacBook

Ola Folks,

Once again I want to drink from the pool of knowledge shared by people using SO.

I have written a small app for OSX that sends key events to an application. I am targeting OSX 10.5.x and newer. However, the problem exists when I build for 10.6.x as well. Everything works fine except when I send only the modifier keys; Alt, Command, Control and Shift.

The problem is that on the two MacBooks, the events for the modifier keys appear to be cleared as soon as the testers move the cursor using the mouse or touch the touchpad.

On a desktop with XCode installed, everything works fine. Just like it should. On two different MacBooks, the problem occurs. The desktop has a standard 101 key keyboard and a multi-button mouse attached.
When a mouse is connected to the MacBooks, a two button mouse with scrollwheel is used. However, the problem exists when no peripherals are attached and the touchpad is used.

What I expect to happen is that the Modifier Key event is sent to the target application, the user moves the cursor using the mouse / touchpad, press buttons on the mouse / touchpad and/or press keys on the keyboard with the modifier key down event 'active'. Then, when they finish, the key up event for the modifier key is sent.

Here is how I am sending key down events, the Shift key for this example:

I have used all three flags for creating the event source (kCGEventSourceStatePrivate, kCGEventSourceStateCombinedSessionState and kCGEventSourceStateHIDSystemState).

I have tried Creating the Keyboard Event with the Event Source as well as null as the first parameter.

I have tried with and without the appropriate flags on the event.

I have tried various combinations of posting the event; kCGHIDEventTap, kCGSessionEventTap and kCGAnnotatedSessionEventTap.

For completeness, here is how I send an up event for the Shift key:

When the testers trigger a modifier key down event, they can see the cursor change as expected. This lets me know the event is being processed by the target application. However, as soon as they touch the mouse or touchpad, the cursor changes back to a standard cursor and the mouse events are processed as if no modifier key events are active.

I would like to know if there is a problem with the way I am sending the events. I would also like to know if there is an alternate way to send Modifier Key events that is Going To Work.

Sorry if I overtalked this. My excuse is that I only slept a couple of hours. :P

Thanx

-isdi-

0 投票する
1 に答える
723 参照

objective-c - アプリケーションがランダムにキー押下の受信を停止する (CGEventTaps)

そのため、この非常にクールなキーボード マクロ アプリケーションを作成するのに多くの時間を費やしました。それはうまく機能しますが、唯一の問題は、数分後に機能しなくなることです. キーを押すと呼び出されなくなります。

ロックダウンすることはできませんでしたが、常に少なくとも 30 秒はかかります。通常、数分間は発生しません。それまでに、私は多くのイベントを傍受して送信しているでしょう。それが発生したとき、アプリケーションはまだ実行されています。

これは私が聞いていることの例です

そしてハンドラー -

また、イベントをインターセプトする (そしてそれを返すCGEventCreate(NULL)) ときは、通常、次のコードを使用して、独自のキーを 1 つ以上押すことに注意してください。KeyCmd などは、通常の定数への単なるショートカットであることに注意してください。

ありがとう!

0 投票する
1 に答える
889 参照

cocoa - Quartz イベントを使用してマウスクリックを処理するにはどうすればよいですか?

CGEventTapすべてのシステム マウス クリック イベントを監視して処理したいと考えています。マウス クリック イベントを検出するのは簡単ですが、一部のクリックがシステムの残りの部分で処理されるのは望ましくありません。そして、私はその方法を理解できません。

mouseUpシステムは、mouseDown、などの低レベルのイベントのみを送信mouseDraggedします。イベントを受け取ったときmouseDown、それがマウス クリックの一部であるかどうかはまだわかりません。ドラッグ イベントである可能性があります。次のイベントを待つ必要があります。それが の場合mouseUp、クリックがあります。しかし、クリックを自分で処理し、イベント キューの残りの部分を下がらないようにしたい場合はmouseUp、前のイベントmouseDownが既に送信されているため、単純にイベントを盗むことはできません。

mouseDownイベントを遅らせて、対応する を受信した後でのみ送信できると思っていましたが、それは間違っていると感じました。アプリケーションのためだけにすべてのシステムイベントmouseUpを遅らせたくありません。mouseDown何か不足していますか?

0 投票する
1 に答える
1083 参照

cocoa - CGEventTap はアプリケーション入力をブロックします

CGCreateEventTap を使用してグローバルなマウス クリックを監視しようとしていますが、これを行うと自分のアプリとのやり取りがブロックされるようです。実行中の他のアプリでのマウス クリックは正常に機能しますが、自分のアプリ (DemoAppDelegate アプリ) は完全に応答しません。アプリのメイン ウィンドウをドラッグできますが、赤/黄/緑のウィンドウ ボタンがグレー表示されます。また、DemoApp のメニューもクリックできません。

これは私には非常に奇妙に思えますが、私には理解できませんでした。イベント タップを使用する例はほとんどないため、アドバイスをいただければ幸いです。

0 投票する
2 に答える
686 参照

macos - ホット キーのイベント タップ (CFMachPortRef) の問題 - コールバックが呼び出されない

ホットキーによる機能の 1 つをサポートするデスクトップ アプリケーションを開発しています。これを機能させるために Event Tap を使用しています。

ただし、(ランダムに) コールバックが呼び出されないことがあります。ホット キーが機能しないため、この機能が機能していないようです。

誰かがここで問題を特定するのを手伝ってくれませんか。

以下はコード スニペットです。