7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unityでデスクトップマスコットのためにウィンドウ最大化した

Last updated at Posted at 2018-03-04

#はじめに
Unityでデスクトップマスコットのために○○したシリーズの第3弾です。
今まではウィンドウの透過タイトルバーの非表示をやってきましたが
今回はウィンドウの最大化をおこなっていきます。

「マスコットを動かしたいなー」と思いたちまして
今後の拡張内容を考慮して**「ウィンドウ内の表示場所を変える」**ことで
マスコットを動かそうと決めました。

それを実現するために
「ディスプレイ画面にフィットするようにウィンドウサイズを変更する必要がある」
と思い, ウィンドウの最大化を実装しました。

#開発および実行環境

  • Unity 5.6.3f1
  • Visual Studio C# 2017
  • Windows 10 Home

#実際のコード
以下が実際に作成したコードです。

ChangeToMaxSize.cp
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class ChangeToMaxSize
{

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern int FindWindow(String className, String windowName);
    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    private static extern int SetWindowPos(int hwnd, int hwndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
    private static extern int GetDesktopWindow();
    [DllImport("user32.dll", EntryPoint = "GetWindowRect")]
    private static extern bool GetWindowRect(int hWnd, out RECT rect);


    static int handle; // ウィンドウ

    const String WINDOW_NAME = "[ウィンドウの名前]";

    const int HWND_TOPMOST = -1; // 常に最前面に表示
    const int SWP_SHOWWINDOW = 0x0040; // ウィンドウを表示

    private static int displayWidth; // ディスプレイの幅
    private static int displayHeight; // ディスプレイの高さ

    void Start()
    {

#if UNITY_EDITOR

#else

        // ディスプレイサイズを取得
        int display = GetDesktopWindow();
        RECT rect = new RECT();
        GetWindowRect(display, out rect);

        displayWidth = rect.right; // ディスプレイの幅を取得
        displayHeight = rect.bottom; // ディスプレイの高さを取得

        handle = FindWindow(null, WINDOW_NAME); // 起動したウィンドウを指定

        // SetWindowLongによる変更を適用
        SetWindowPos(handle, HWND_TOPMOST, 0, 0, displayWidth, displayHeight, SWP_SHOWWINDOW);


#endif

    }

}

今までと同様にUnityのPlayボタンから実行した場合は適用されずに
ビルドしたプログラムでのみ適用されるようにしています。

処理としては

ディスプレイのサイズを取得する

サイズ変更するウィンドウを指定

ウィンドウの場所をディスプレイ画面の左上(0, 0)に合うようにして
ウィンドウのサイズをディスプレイのサイズと同じにする

という感じにおこなっています。

#まとめ
今回はWindowsAPIを使ってC#でディスプレイを最大化させました。

今回は今までに比べ, デスクトップマスコットに必須な技術って感じはしませんが
どこかで使えるだろうとのことで記事にしました。

これでデスクトップマスコット実現に一歩近づいたかなと思います。

#参考
http://www-higashi.ist.osaka-u.ac.jp/~k-maeda/vcpp/sec2-5wndsize.html
https://dobon.net/vb/dotnet/graphics/screencapture.html

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?