« 思っていた以上にいい | トップページ | やっぱり面白い »

2019年7月24日 (水)

Alt+Tab

朝は雲が多かったけれど、しばらくすると、太陽が出て、青空も見えた。

雲を見ると、夏らしい雲になっていて、あぁ、夏なんだ、と思わされた。

もうそろそろかな、と思っていたら、今日、梅雨明け!

例年より3日遅かったようだ。

梅雨の期間って、7月の大半を潰すのね。

 

ずーっと気になっていたけれど、対処していなかったことが解決したので、情報共有。

困っていたわけではなかったし、まぁ、仕方ないか、そういうものか、と思っていたので、放置状態だった。
ふと気になって、そのことを検索し、やってみたら、それが解決!

何が解決したかと言うと、VB.NETで自分で作ったプログラムを、Alt+Tabした時の画面の中に表示させたくなかったことが解決。
タスクバーには表示させていなかった。
でも、Alt+Tabをした時に、そのプログラムが表示されていて、ちょっとな、という感じだった。

既にこの中には、そのプログラムは見えていないけれど、Windows10でAlt+Tabをすると、こういう感じで表示される。

話はずれるけれど、上記だと見にくいので、僕は、Best Alt-Tab Alternative for Windows 10 - Switch Tasks and Manage Windows Faster - NTWind Softwareというのを使わせてもらっている。

デスクトップの中にそのソフトが表示されるし、左側にアイコンも表示されるので、とても見やすい。
これ、Windows7時代から使わせてもらっている。

話を戻して、このAlt+Tabの画面で、自作プログラムを表示させないように出来たことについて。

最初得た情報では出来ず、その中にキーワードがあったので、それに絞り込んで検索すると、情報が出てきた。

フォームを表示させずにトレイアイコンを表示する - .NET Tips (VB.NET,C#...)

ここの「CreateParamsをオーバーライドする方法」というところ。

引用させてもらうと、

'Imports System.Security.Permissions

'フォームのCreateParamsプロパティをオーバーライドする
Protected Overrides ReadOnly Property CreateParams() As CreateParams
<SecurityPermission(SecurityAction.Demand, _
Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Get
Const WS_EX_TOOLWINDOW As Int32 = &H80
Const WS_POPUP As Int32 = &H80000000
Const WS_VISIBLE As Int32 = &H10000000
Const WS_SYSMENU As Int32 = &H80000
Const WS_MAXIMIZEBOX As Int32 = &H10000

Dim cp As System.Windows.Forms.CreateParams
cp = MyBase.CreateParams
cp.ExStyle = WS_EX_TOOLWINDOW
cp.Style = WS_POPUP Or WS_VISIBLE Or _
WS_SYSMENU Or WS_MAXIMIZEBOX
Return cp
End Get
End Property

でも、このままだと、Formそのものも見えなくなるので、それは都合が悪い。
だから、不要な部分を削除したら、こうなった。

'Imports System.Security.Permissions

'フォームのCreateParamsプロパティをオーバーライドする
Protected Overrides ReadOnly Property CreateParams() As CreateParams
<SecurityPermission(SecurityAction.Demand, _
Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Get
Const WS_EX_TOOLWINDOW As Int32 = &H80

Dim cp As System.Windows.Forms.CreateParams
cp = MyBase.CreateParams
cp.ExStyle = WS_EX_TOOLWINDOW
Return cp
End Get
End Property

「Imports」は、「'」を外して、インポート関連のところに移動。
今回の僕のプログラムの場合は、Formそのものを消したいわけではないので、「WS_VISIBLE」は不要、ポップアップやメニュー、ウインドウの最大化関連は、既に対処していて、今回は関係ないので、削除。
Alt+Tabでの非表示で大事なのは、「WS_EX_TOOLWINDOW」ということで、そこだけ残した。

上記を、そのFormのClass内のどこかに記述しておけばいい。

そして、Formをロードする時に、「ShowInTaskbar = False」を宣言しておく。

そうすれば、Alt+Tabをしても、そのプログラムは表示されなくなる。

ここからは本題から外れるけれど、この自作プログラムでは、マウス透過も実現している。
そのプログラムのFormは表示されているけれど、その背後(裏)にあるプログラムを「触る(操作)ことが出来る」というもの。

せっかくなので、それについても書いておこう。

これを実現するのが、下記のもの。

'マウスクリック透過
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Const WS_EX_TRANSPARENT As Integer = &H20
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or WS_EX_TRANSPARENT
Return cp
End Get
End Property

もしかしたら、これに関連して、何かインポートする必要性があるかもしれない。
それはわからなくなっていて、恐縮...

これが動作するためには、Formの透明度(Opacity)を1未満にしないといけないので注意。

先述のAlt+Tab関連と上記のマウス透過のコードは、そのまま記述するとバッティングするので、それらを融合させるとこうなる。

'Imports System.Security.Permissions

'マウスクリック透過とAlt+Tabで表示させないようにする設定
Protected Overrides ReadOnly Property CreateParams() As CreateParams
<SecurityPermission(SecurityAction.Demand, Flags:=SecurityPermissionFlag.UnmanagedCode)>
Get
'マウスクリック透過
Const WS_EX_TRANSPARENT As Integer = &H20
'Alt+Tabの中での非表示
Const WS_EX_TOOLWINDOW As Int32 = &H80
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or WS_EX_TRANSPARENT Or WS_EX_TOOLWINDOW
Return cp
End Get
End Property

「ShowInTaskbar = False」を忘れずに宣言。

と、こんな感じで、Alt+Tabの中での非表示とマウス透過の共存が出来たのである。

長年(数年)気になっていたことが解決し、嬉しいのである!

|

« 思っていた以上にいい | トップページ | やっぱり面白い »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 思っていた以上にいい | トップページ | やっぱり面白い »