/// <summary> /// 画素の色を基に操作受付を切り替える /// </summary> void UpdateClickThrough() { // マウスカーソル非表示状態ならば透明画素上と同扱い bool opaque = (onObject && !UniWinApi.GetCursorVisible()); if (_isClickThrough) { if (opaque) { if (uniWin != null) { uniWin.EnableClickThrough(false); } _isClickThrough = false; } } else { if (isTransparent && !opaque && !isDragging) { if (uniWin != null) { uniWin.EnableClickThrough(true); } _isClickThrough = true; } } }
/// <summary> /// 自分のウィンドウハンドルが不確かならば探しなおす /// </summary> private void UpdateWindow() { if (uniWin == null) { return; } // もしウィンドウハンドル取得に失敗していたら再取得 if (!uniWin.IsActive) { //Debug.Log("Window is not active"); FindMyWindow(); } else if (!isWindowChecked) { // 自分自身のウィンドウか未確認の場合 // 今アクティブなウィンドウが自分自身かをチェック if (uniWin.CheckActiveWindow()) { isWindowChecked = true; // どうやら正しくウィンドウをつかめているよう } else { // ウィンドウが違っているようなので、もう一度アクティブウィンドウを取得 uniWin.Reset(); uniWin.Dispose(); uniWin = new UniWinApi(); FindMyWindow(); } } }
/// <summary> /// 自分のウィンドウハンドルを見つける /// </summary> private void FindMyWindow() { // ウィンドウが確かではないとしておく isWindowChecked = false; // 現在このウィンドウがアクティブでなければ、取得はやめておく if (!Application.isFocused) { return; } // 今アクティブなウィンドウを取得 var window = UniWinApi.FindWindow(); if (window == null) { return; } // 見つかったウィンドウを利用開始 uniWin.SetWindow(window); // 初期状態を反映 SetTopmost(_isTopmost); SetMaximized(_isMaximized); SetMinimized(_isMinimized); SetTransparent(_isTransparent); if (_enableFileDrop) { BeginFileDrop(); } }
// Update is called once per frame void Update() { // 自ウィンドウ取得状態が不確かなら探しなおす // マウス押下が取れるのはすなわちフォーカスがあるとき if (Input.GetMouseButtonDown(0)) { UpdateWindow(); } // キー、マウス操作の下ウィンドウへの透過状態を更新 UpdateClickThrough(); // マウスドラッグでウィンドウ移動 DragMove(); // ウィンドウ枠が復活している場合があるので監視するため、呼ぶ uniWin.Update(); // デバッグ if (Input.GetKey(KeyCode.Space)) { var list = UniWinApi.FindWindows(); foreach (var window in list) { Debug.Log(window); } Debug.Log("CheckActiveWindow: " + uniWin.CheckActiveWindow()); } }
/// <summary> /// 最大化時以外なら、マウスドラッグによってウィンドウを移動 /// </summary> void DragMove() { if (uniWin == null) { return; } // ドラッグでの移動が無効化されていた場合 if (!enableDragMove) { isDragging = false; return; } // 最大化状態ならウィンドウ移動は行わないようにする bool isFullScreen = uniWin.IsMaximized; #if !UNITY_EDITOR // フルスクリーンならウィンドウ移動は行わない // エディタだと true になってしまうようなので、エディタ以外でのみ確認 if (Screen.fullScreen) { isFullScreen = true; } #endif if (isFullScreen) { isDragging = false; return; } // マウスドラッグでウィンドウ移動 if (Input.GetMouseButtonDown(0)) { lastMousePosition = UniWinApi.GetCursorPosition(); isDragging = true; } if (!Input.GetMouseButton(0)) { isDragging = false; } if (isDragging) { Vector2 mousePos = UniWinApi.GetCursorPosition(); Vector2 delta = mousePos - lastMousePosition; lastMousePosition = mousePos; Vector2 windowPosition = uniWin.GetPosition(); // 現在のウィンドウ位置を取得 windowPosition += delta; // ウィンドウ位置に上下左右移動分を加える uniWin.SetPosition(windowPosition); // ウィンドウ位置を設定 } }
// Use this for initialization void Awake() { // ウィンドウが準備できたタイミングで初期値を設定できるよう保存しておく isInitiallyTopmost = _isTopmost; isInitiallyMaximized = _isMaximized; isInitiallyMinimized = _isMinimized; Input.simulateMouseWithTouches = false; if (!currentCamera) { // メインカメラを探す currentCamera = Camera.main; // もしメインカメラが見つからなければ、Findで探す if (!currentCamera) { currentCamera = FindObjectOfType <Camera>(); } } // カメラの元の背景を記憶 if (currentCamera) { originalCameraClearFlags = currentCamera.clearFlags; originalCameraBackground = currentCamera.backgroundColor; } // マウス下描画色抽出用テクスチャを準備 colorPickerTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false); #if (UNITY_WIN || UNITY_STANDALONE_WIN) // ウィンドウ制御用のインスタンス作成 uniWin = new UniWinApi(); // 透過方式の指定 uniWin.TransparentType = transparentType; // 自分のウィンドウを取得 FindMyWindow(); #endif #if UNITY_EDITOR // エディタのウィンドウ配置が変化した際の呼び出し EditorApplicationUtility.windowsReordered += () => { this.isWindowChecked = false; // ウィンドウが不確かであるとする //Debug.Log("Editor windows reordered"); }; #endif }
// Use this for initialization void Awake() { if (!currentCamera) { // メインカメラを探す currentCamera = Camera.main; // もしメインカメラが見つからなければ、Findで探す if (!currentCamera) { currentCamera = FindObjectOfType <Camera>(); } } // カメラの元の背景を記憶 if (currentCamera) { originalCameraClearFlags = currentCamera.clearFlags; originalCameraBackground = currentCamera.backgroundColor; } // マウス下描画色抽出用テクスチャを準備 colorPickerTexture = new Texture2D(1, 1, TextureFormat.ARGB32, false); #if (UNITY_WIN || UNITY_STANDALONE_WIN) // ウィンドウ制御用のインスタンス作成 uniWin = new UniWinApi(); // 自分のウィンドウを取得 FindMyWindow(); #endif #if UNITY_EDITOR // エディタのウィンドウ配置が変化した際の呼び出し EditorApplicationUtility.windowsReordered += () => { this.isWindowChecked = false; // ウィンドウが不確かであるとする //Debug.Log("Editor windows reordered"); }; #endif }