質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

1回答

1600閲覧

フォームをアクティブにさせない、させるを切り替えたい

kjkjmk

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2023/12/17 06:46

実現したいこと

常に最前面に表示された状態を維持したい画面があるのですが、ゲームなどの画面を一緒に開いた際に、最前面を維持したい画面にアクティブを奪われてゲーム画面のコントロールが奪われてしまい、同時に稼働することができません。

再度ゲーム画面をクリックすればコントロールがゲームに移りますが、
再び最前面に表示したい画面をクリックしてしまうと、同じことの繰り返しになってしまいます。

そこでフォームをクリックしてもアクティブにさせない方法を検索し、以下の
コードを入力することで、アクティブにさせないフォームを作成できたのですが、今度はテキストボックス等に入力ができなくなってしまいました。

※正確には最小化した後に再び表示させたりして、アクティブにさせることが可能なのでその手順を行えば入力可能にできます。

そこで、checkbox等で自由にフォームを非アクティブのまま維持させたり、アクティブ状態になるようにしたりと切り替えることが可能なのか、可能であれば、方法をどなたかご教示いただきたいです。

簡潔に書くと、checkboxを配置して

Trueの場合:フォームをクリックしてもフォームが非アクティブのままの状態
falseの場合:フォームをクリックするとフォームがアクティブになる

のような状態にしたいです。
非アクティブのまま最前面に常に表示させておいて、いつでもテキストボックス入力以外の操作可能な状態にしているという想定です。
よろしくお願いします。

前提

言語:C#
環境:visualstudio、Windowsフォーム
.NET Framework 4,7,2

▼非アクティブ状態にするコードの参照元
https://hima-tubusi.blogspot.com/2016/08/c.html

該当のソースコード

private const int WS_EX_NOACTIVATE = 0x8000000; protected override CreateParams CreateParams { get { CreateParams p = base.CreateParams; if (!DesignMode) { p.ExStyle |= (WS_EX_NOACTIVATE); } return (p); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

基本的には前回の質問と同じように、フラグを付け外しするだけじゃないですかね?
リッチテキストボックスのスクロールバーを左に表示したい

前回はRichTextBoxWS_EX_LEFTSCROLLBARでしたが、今回はFormWS_EX_NOACTIVATEになるということです。

cs

1using System; 2using System.Runtime.InteropServices; 3using System.Windows.Forms; 4 5namespace Quwwuruzl7q435p 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 13 TopMost = true; 14 15 new TextBox 16 { 17 Dock = DockStyle.Top, 18 Parent = this, 19 }; 20 21 new CheckBox 22 { 23 Dock = DockStyle.Top, 24 Parent = this, 25 Text = "NoActivate", 26 }.CheckedChanged += CheckedChanged; 27 } 28 29 private void CheckedChanged(object sender, EventArgs e) 30 { 31 if (sender is CheckBox checkBox) 32 NoActivate = checkBox.Checked; 33 } 34 35 // 別にプロパティにする意味もないが、前回回答の使いまわし^^; 36 public bool NoActivate 37 { 38 get => (GetWindowLong(Handle, GWL_EXSTYLE) & WS_EX_NOACTIVATE) != 0; 39 set 40 { 41 var style = GetWindowLong(Handle, GWL_EXSTYLE); 42 if (value) style |= WS_EX_NOACTIVATE; // フラグ付ける 43 else style &= ~WS_EX_NOACTIVATE; // フラグ外す 44 SetWindowLong(Handle, GWL_EXSTYLE, style); 45 } 46 } 47 48 private const int GWL_EXSTYLE = -20; 49 private const int WS_EX_NOACTIVATE = 0x8000000; 50 [DllImport("user32")] private extern static int GetWindowLong(IntPtr hWnd, int nIndex); 51 [DllImport("user32")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 52 } 53}

投稿2023/12/17 08:20

TN8001

総合スコア10024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問