HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1005
ゆっくりXPWindows 11の角丸ウィンドウについて7解決


ゆっくりXP

リンク

2023/10/5(Thu) 17:40:04|NO.100145

Windows 11では必ず角丸ウィンドウになりますよね。
ただ角丸になったせいで、左下や右下の部分が見えなくなってしまうので、これをどうにかならないのかについての疑問です。

なぜかタスクマネージャーやレジストリエディタではウィンドウが四角にならないのですが、どうにかならないのでしょうか?

あと、タスクバーとデスクトップだけクリックしたら、そのウィンドウを除外することはできないでしょうか。

#include "user32.as" #packopt hide 1 #uselib "dwmapi.dll" //#func global DwmGetWindowAttribute "DwmGetWindowAttribute" int, int, int, int #func global DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int #define global DWMWA_USE_IMMERSIVE_DARK_MODE 20 #define global DWMWA_WINDOW_CORNER_PREFERENCE 33 #enum global DWMWCP_DEFAULT = 0 #enum global DWMWCP_DONOTROUND #enum global DWMWCP_ROUND #enum global DWMWCP_ROUNDSMALL screen 0,410,60 title "ウィンドウの角丸を無効化" mes "角丸を無効にしたいウィンドウをクリックしてください。" repeat stick click,,0 if click & 256:break wait 1 loop window = GetForegroundWindow() //子ウィンドウやオブジェクトの場合は、必ず親のウィンドウを取得する repeat object = GetParent(window) if object = 0:break window = object loop //ウィンドウを四角化 opt = DWMWCP_DONOTROUND DwmSetWindowAttribute window,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4 if stat = 0:dialog "成功":else:dialog "失敗",1 end



この記事に返信する


沢渡

リンク

2023/10/6(Fri) 17:53:37|NO.100151

コードを以下のように書き換えたらタスクマネージャーのハンドルは取得できたのですが、
ダイアログが「失敗」と表示されるようになってしまいました。
statの内容を調べた感じ、どうも権限の関係でDwmSetWindowAttributeでのアクセスが
拒否されたようなので、試しに以下のコードからexeを作って管理者権限で実行したところ、
今度は上手くいきました。

#include "user32.as" #packopt hide 1 #uselib "dwmapi.dll" //#func global DwmGetWindowAttribute "DwmGetWindowAttribute" int, int, int, int #func global DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int #define global DWMWA_USE_IMMERSIVE_DARK_MODE 20 #define global DWMWA_WINDOW_CORNER_PREFERENCE 33 #enum global DWMWCP_DEFAULT = 0 #enum global DWMWCP_DONOTROUND #enum global DWMWCP_ROUND #enum global DWMWCP_ROUNDSMALL screen 0,410,60 title "ウィンドウの角丸を無効化" mes "角丸を無効にしたいウィンドウをクリックしてください。" onclick gosub *click : flag=0 SetCapture hwnd repeat if flag : break wait 1 loop ReleaseCapture WindowFromPoint ginfo_mx,ginfo_my : window=stat //子ウィンドウやオブジェクトの場合は、必ず親のウィンドウを取得する repeat object = GetParent(window) if object = 0:break window = object loop //ウィンドウを四角化 opt = DWMWCP_DONOTROUND DwmSetWindowAttribute window,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4 if stat = 0:dialog "成功":else:dialog "失敗",1 end *click flag=1 return



ゆっくりXP

リンク

2023/10/6(Fri) 18:54:51|NO.100152

沢渡さん検証ありがとうございます。
管理者権限で実行してみたところ、うまくいったのですが、モーダルウィンドウが四角になってくれません。
オブジェクトや子ウィンドウをクリックしても必ず親ウィンドウを取得する場合は、GetParentを使用するのですが、何か問題があるのでしょうか?

//子ウィンドウやオブジェクトの場合は、必ず親のウィンドウを取得する repeat object = GetParent(window) if object = 0:break window = obj



沢渡

リンク

2023/10/7(Sat) 00:15:57|NO.100155

そのコードとは別にdialog命令でダイアログを表示するだけのコードを作り、
そのダイアログをクリックしたら、親ウィンドウが四角になりました。
今回のコードで意図している通りの動作だと思うのですが、それでは問題あるのでしょうか?

ダイアログも四角にしたいということなら、
repeat〜loop内で取得した全てのウィンドウハンドルについて
ウィンドウスタイルにWS_CHILDを持っていないことを確認し、
持っていないのならDwmSetWindowAttributeを実行するという方法でやってみましたが、
これで良いのでしょうか?

#include "user32.as" #packopt hide 1 #uselib "dwmapi.dll" //#func global DwmGetWindowAttribute "DwmGetWindowAttribute" int, int, int, int #func global DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int #define global DWMWA_USE_IMMERSIVE_DARK_MODE 20 #define global DWMWA_WINDOW_CORNER_PREFERENCE 33 #enum global DWMWCP_DEFAULT = 0 #enum global DWMWCP_DONOTROUND #enum global DWMWCP_ROUND #enum global DWMWCP_ROUNDSMALL screen 0,410,60 title "ウィンドウの角丸を無効化" mes "角丸を無効にしたいウィンドウをクリックしてください。" onclick gosub *click : flag=0 SetCapture hwnd repeat if flag : break wait 1 loop ReleaseCapture WindowFromPoint ginfo_mx,ginfo_my : window=stat //子ウィンドウから親ウィンドウをたどる repeat GetWindowLong window,-16 if (stat&0x40000000)=0 { //WS_CHILDを持っていないのなら //ウィンドウを四角化 opt = DWMWCP_DONOTROUND DwmSetWindowAttribute window,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4 } object = GetParent(window) if object = 0:break window = object loop onclick 0 stop *click flag=1 return



ゆっくりXP

リンク

2023/10/8(Sun) 18:36:04|NO.100164

やはりモーダルウィンドウのハンドルを取得するには、GetWindowLongを使えばよかったのですね…。ちゃんと意図した動作になりました。

https://learn.microsoft.com/ja-jp/windows/apps/desktop/modernize/apply-rounded-corners
↑あとこのサイトによると、DWMWCP_ROUNDとDWMWCP_DEFAULTで元に戻せるみたいなのですが、何が違うのでしょうか?



沢渡

リンク

2023/10/9(Mon) 16:41:07|NO.100169

調べてもわからないので推察ですが、将来的にWindowsでは
「角を丸めるかどうか」を設定できるようになるかもしれなくて、
その場合、DWMWCP_DEFAULTの場合は設定に従うが、
DWMWCP_ROUNDは設定に関係なく丸めるのかな……と私は思います。
以下、試しに四角と丸をトグルするような仕様にしてみましたが、
今のところDWMWCP_DEFAULTでもDWMWCP_ROUNDでも上手く行くようです。

#include "user32.as" #packopt hide 1 #uselib "dwmapi.dll" #func global DwmGetWindowAttribute "DwmGetWindowAttribute" int, int, int, int #func global DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int #define global DWMWA_USE_IMMERSIVE_DARK_MODE 20 #define global DWMWA_WINDOW_CORNER_PREFERENCE 33 #enum global DWMWCP_DEFAULT = 0 #enum global DWMWCP_DONOTROUND #enum global DWMWCP_ROUND #enum global DWMWCP_ROUNDSMALL screen 0,410,60 title "ウィンドウの角丸を無効化" mes "角丸を無効にしたいウィンドウをクリックしてください。" onclick gosub *click : flag=0 SetCapture hwnd repeat if flag : break wait 1 loop ReleaseCapture WindowFromPoint ginfo_mx,ginfo_my : window=stat //子ウィンドウから親ウィンドウをたどる repeat GetWindowLong window,-16 if (stat&0x40000000)=0 { //WS_CHILDを持っていないのなら //ウィンドウが丸まっているなら四角に、四角なら丸める opt = 0 DwmGetWindowAttribute window,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4 if opt=DWMWCP_DONOTROUND : opt=DWMWCP_DEFAULT : else : opt=DWMWCP_DONOTROUND //if opt=DWMWCP_DONOTROUND : opt=DWMWCP_ROUND : else : opt=DWMWCP_DONOTROUND //←今のところどちらの場合でも上手く行く DwmSetWindowAttribute window,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4 } object = GetParent(window) if object = 0:break window = object loop onclick 0 stop *click flag=1 return



ゆっくりXP

リンク

2023/10/11(Wed) 22:23:51|NO.100196

DWMWCP_DEFAULTとDWMWCP_ROUNDのウィンドウの見た目は同じだけど、DwmGetWindowAttributeで角丸の状態を取得してみたところ、同じ見た目であっても、DWMWCP_DEFAULTとDWMWCP_ROUNDは個別に取得できるみたいですね。

角丸に考慮してないゲームもあって、角丸ウィンドウで見切れてしまう部分もあったので、お陰でなんとかなりそうです。
ありがとうございました。



ゆっくりXP

リンク

2023/10/28(Sat) 12:24:06|NO.100363

同じかなと思ってたら、ツールウィンドウがDWMWCP_DEFAULTとDWMWCP_ROUNDで違うみたいなんですね。
沢渡さんも同じ環境なのでしょうかね…?
DWMWCP_ROUNDSMALLと同じ挙動…?

いきなりスレッドを上げてすみません。

#include "user32.as" #packopt hide 1 #uselib "dwmapi.dll" //#func global DwmGetWindowAttribute "DwmGetWindowAttribute" int, int, int, int #func global DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int #define global DWMWA_WINDOW_CORNER_PREFERENCE 33 #enum global DWMWCP_DEFAULT = 0 #enum global DWMWCP_DONOTROUND #enum global DWMWCP_ROUND #enum global DWMWCP_ROUNDSMALL screen 0,320,240,screen_tool screen 1,320,240,screen_tool|screen_fixedsize //大きい角丸にする opt = DWMWCP_ROUND DwmSetWindowAttribute hwnd,DWMWA_WINDOW_CORNER_PREFERENCE,varptr(opt),4



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100145への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.