Closed tasuren closed 2 years ago
Objective-CのランタイムAPIのバインディングのobjcっていうRustのライブラリを使うことで、wryが使っているtaoというライブラリのウィンドウのクリック貫通を有効にすることに成功した。 これでMac対応ができそうだ。
#[macro_use] extern crate objc;
use objc::runtime::{ Object, YES };
// クリック貫通するようにウィンドウの設定をobjcを使っていじる。windowはtaoのWindow
unsafe {
let _: () = msg_send![window.ns_window() as *mut Object, setIgnoresMouseEvents: YES];
};
一応クリックは貫通するが自分が求めていた貫通が再現できなかった。
というの壁紙がメインウィンドウとして認識されクリックを押しても背景を設定しているアプリにすぐクリックが行かず、ダブルクリックをしないとアプリがメインウィンドウとならない。
だからアプリをいじれない状態となってしまう。
ほかの対処法でウィンドウ(NSWindow
)の状態(level
)をCGWindowLevelKey
のオーバーレイというやつで設定することで、完璧に貫通するように表示することができた。
だがこれは常に最前列になってしまうため他のアプリをいじっている時も表示される。
対象のアプリがメインになる時だけオーバーレイとするというふうにする必要がありそう。
一応クリックは貫通するが自分が求めていた貫通が再現できなかった。 というの壁紙がメインウィンドウとして認識されクリックを押しても背景を設定しているアプリにすぐクリックが行かず、ダブルクリックをしないとアプリがメインウィンドウとならない。 だからアプリをいじれない状態となってしまう。 ほかの対処法でウィンドウ(
NSWindow
)の状態(level
)をCGWindowLevelKey
のオーバーレイというやつで設定することで、完璧に貫通するように表示することができた。 だがこれは常に最前列になってしまうため他のアプリをいじっている時も表示される。 対象のアプリがメインになる時だけオーバーレイとするというふうにする必要がありそう。
オーバーレイ無効化がなぜかできなかったから常にメインウィンドウにしないで一番前に表示するっていうorderFrontRegardless
っていうやつを毎回呼び出すことにした。
とりあえず実装完了 クリックすると一瞬後ろに行き若干チカっとするのでどうにかしてLevelKeyのやつができるようにしたい。
LevelKeyの切り替えができた。 それとそれをするためのやつがtaoに最初から実装されてた。
一応クリック貫通をする方法はCocoaにはあるっぽい。 Cocoaはあまり知らないが。