直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円、家賃4万円で生活するひつじ人間。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 スポンサー広告

C# 常にデスクトップに張り付くForm(最背面に表示 windows +Dキー 最小化抑止)

 

 windows10 を使っているのだが(もう使用者かなり多いよね、まだ使ってない頑固な人も居るんだろうけど)、sticky note とか Fymemoなどの付箋ソフトで windows キー+D(デスクトップを表示)を押すと付箋まで最小化しちゃうってのがかなり不満だった。
 常に見ないと忘れちゃうんだけどねー俺って。

 という訳で自分なりに探したり、頭を捻ったりして割り出してみた。


割り出したコード・・・・
 これが笑っちゃうほど簡単で、
  public Form1()
        {
            InitializeComponent();

            MinimizeBox = false;
   //これがないと最小化されてしまった
        }

        private void Form1_Deactivate(object sender, EventArgs e)
        {
            this.Focus();
            this.TopMost = true;

        }

 Deactivateイベントを追加するだけという。

 どうなるか動画で再現してみよう。



 

 大雑把なものとはいえ、最前面に表示させ続ける前提なら簡単に出来る。
 それ以上のもの(例えば、windows キーで最小化そのものを抑止する)に関しては調査中。
 ウィンドウを最背面に設定するのが上手く行かなくて困ってる。


 質問しようかと思ってた矢先、検索ワードをここ1年で更新されたヤツに絞ったらここで見つけることができた。

C# デスクトップ時計(5) 最前面表示/最背面表示



 見事に動作。多謝。
 それでも最小化を防ぐにはTopMost = true でないといけないので、文字通りデスクトップに張り付くとなると直接描画するしかないんだろうなと。



C# 透過したフォームを最背面にしたいのだが…

 これも動作を確認できた。てっきり動作してないかと思ったが、こんな風に表示された。
 https://pbs.twimg.com/media/CwpgX2oVIAAiRlr.jpg 

    //protected override void OnPaintBackground(PaintEventArgs e)
        //{
        //}
 ここだけコメントアウトして実行してみた。 見事に張り付くんだこれが。 
 windowsキー+D(デスクトップを表示)の対象にならないし。 


 ”動かせない”って点を除けば有力だろう。改造出来ないか検討してみる。

最終的には下記のようになった。



//ちゃんと動くよなこれ・・・・。
namespace WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        public delegate bool EnumWindowCallBack(IntPtr hwnd, IntPtr lParam);

        [DllImport("USER32.DLL", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);

        // SetParent 関数
        [DllImport("USER32.DLL", CharSet = CharSet.Auto)]
        private static extern System.IntPtr SetParent(
            System.IntPtr hWndChild,
            System.IntPtr hWndNewParent
        );

        [DllImport("USER32.Dll")]
        static extern int EnumWindows(EnumWindowCallBack x, IntPtr y);

        [DllImport("User32.Dll", CharSet = CharSet.Unicode)]
        public static extern int GetClassName(IntPtr hWnd, StringBuilder s, int nMaxCount);


        public Form1()
        {
            InitializeComponent();
          //  this.FormBorderStyle = FormBorderStyle.None;
        //これを入れるとデスクトップに張り付いたまま動かせなくなる
   https://pbs.twimg.com/media/CwpgX2oVIAAiRlr.jpg
  //これはこれで面白いと思う。
        }

        //protected override void OnPaintBackground(PaintEventArgs e)
        //{
        //}
   //ウィンドウが消える。buttonは表示されるようだ。   

    

        // ウィンドウを列挙するためのコールバックメソッド
        private bool EnumerateWindow(IntPtr hWnd, IntPtr lParam)
        {
            StringBuilder sbClassName = new StringBuilder(256);
            int result = GetClassName(hWnd, sbClassName, 256);
            string className = sbClassName.ToString();
            if (className.Equals("WorkerW") || className.Equals("Progman"))
            {
                IntPtr hDt = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null);
              //↑この"SHELLDLL_DefView"がキモ。このクラス名が入っていな  //いと、Program Managerだろうと何だろうとデスクトップウィンドウを取得できない。
                if (hDt != null && hDt != IntPtr.Zero)
                {
                    SetParent(this.Handle, hDt);
                }
            }
            return true;
        }

 

        private void button1_Click_1(object sender, EventArgs e)
        {
            EnumWindows(EnumerateWindow, IntPtr.Zero);
        }



     


    }
    }

   


 実行結果だが、何故かあせたような表示になってしまう。やはりよく分からない点が多い。
(後日、文字部分が透明になっていることが判明。文字サイズをデカくしてみれば分かる。やはりAeroのようで、win10の設定から 「スタート、タスクバー、アクションセンターを透明にする」のチェックを外したら従来通りになった)

(16/11/17追記)
妙なんだが、このwin10 build14965で透明化が治ってた。

Aeroにて文字までAeroになってしまう対策
これを使って対策しようと思っていたのだが。環境によりけりだし、やっぱり要るのかも知れない。

80_設定

動作的には完璧。 別にここまでせんでもいいのだが、選択肢は多い方が良い。
 65_Form1.jpg
 

わざわざ列挙させずに直接、クラス名が"SHELLDLL_DefView"をFindWindowさせようとしたが失敗。なぜだ(; ・`д・´)


呼び出しが      EnumWindows(EnumerateWindow, IntPtr.Zero); で intを返すのにきちんと動作するってのも意味不明。つーかやはり体系的に学んでない現状に限界があるんだろうな。




 学習方法が、単にテスト駆動&アルゴリズムの理解だからだろう。
    以前みたいに無理に結果を追い求めるのは無謀だ。アルゴリズムさえ理解できれば、何とか応用まではイケるはず。
関連記事
スポンサーサイト

 【C#】Fakesticky

 Fakesticky

- 0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。