6
5

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 5 years have passed since last update.

OthloTechAdvent Calendar 2019

Day 3

Windowsでオーバーレイフォームを作った

Last updated at Posted at 2019-12-02

昨日に続きオスロアドベント3日目。もうひとシリーズ書きたい。

はじめに

 恋声を大幅に拡張するアプリを作ってて、声のセットを変える機能をつけました。ただ、ゲーム中だと今、どの声に変換されているか確認できず、友人とオカマ声でボイチャをするやらかしをしたのでこのオーバーレイ作りました。完成版のアプリはこちらです。オーバーレイ自体は意外と簡単でした。

オーバーレイ的なFormをつくる

方針

 オーバーレイは、以下のような特徴があります。それらを順番に実現します。

  • 拡大・縮小とかの枠がない
  • タスクバーに表示されない
  • 必要なところは半透明、必要ないところは透明
  • 指定の位置にある
  • 常に画面の前面にある
  • クリックは透過する

オーバレイをさせるFormをつくる

 こんな感じのオーバーレイさせるフォームを作ります。(フォームデザイナで作ってもいいですが、そこまですることもないだろということでプログラムonlyです)

using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Text;
using System;

class OverlayForm : Form
    {
        public Label lblMessage;

        public OverlayForm() {
             //表示する部品を作る
            lblMessage = new Label
            {
                Anchor = AnchorStyles.Left,
                Text = "オーバーレイふぉーむ",
                AutoSize = true
            };
            //フォームの左上に設定
            lblMessage.Left = 0;
            lblMessage.Top = 0;
            //フォームに表示
            Controls.Add(lblMessage);
        }
    }

これでオーバーレイふぉーむと書かれたWindows Formが表示されます。

拡大・縮小の枠を消す

 これ以降、全てOverlayForm(){}の中に書いてあるものだと思ってください。

    FormBorderStyle = FormBorderStyle.None;

 これで拡大・縮小の枠が消えます。

タスクバーに表示させない

    ShowInTaskbar = false;

 これでタスクバーに表示されなくなります。

半透明にする

    TransparencyKey = BackColor;
    Opacity = 0.7;

TransparencyKeyで背景色の設定を、Opacityで色のあるところの透明度を設定しています。

画面上の位置指定

    StartPosition = FormStartPosition.Manual;
    Location = new Point(0, 0);

StartPlsition = FormStartPosition.Manual;で画面上の位置を指定できるようにして、Locationで位置指定します。

常に画面の前面に出す

    TopMost = true;

 これで常に画面の前面になるはずです。ただし、FPSゲームなどではチート対策等で無効になる場合があるので気を付けてください。(ゲームでも使える方法があったら教えてほしい)

クリックを透過させる

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020;
            return cp;
        }
    }

 こいつだけ少し特殊で、OverlayForm(){}の外側です。何をしているのかというと、Formを作るときに属性を追加しています。その結果、このFormにはクリックできず、下のフォームにクリックが移ります。

おわりに

 オーバーレイってかっこいいけど悪用しないでね。

←back
Windowsで他プロセスを操る

6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?