|
|
|
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
| |
|
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
| |
|
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
| |
|
2023/10/11(Wed) 22:23:51|NO.100196
DWMWCP_DEFAULTとDWMWCP_ROUNDのウィンドウの見た目は同じだけど、DwmGetWindowAttributeで角丸の状態を取得してみたところ、同じ見た目であっても、DWMWCP_DEFAULTとDWMWCP_ROUNDは個別に取得できるみたいですね。
角丸に考慮してないゲームもあって、角丸ウィンドウで見切れてしまう部分もあったので、お陰でなんとかなりそうです。
ありがとうございました。
|
|
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
|
|