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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0815
科学太郎全画面表示(フルスクリーン)の検出方法は?5解決


科学太郎

リンク

2018/8/15(Wed) 22:53:46|NO.85087

現在、4年前のサイドバー・ランチャーの再挑戦をしてます。
そこで
全画面表示モードの設定時には「非表示」
全画面表示モードの解除時には「表示」
にしたい訳です。

インターネット・エクスプローラなどが「F11」キーで全画面表示(フルスクリーン)に出来ますよね。
他のソフトも何らかの方法で全画面表示に出来ます。

この全画面表示モードを検出する方法を知りたいです。
また、全画面表示モードが解除された時の検出方法も知りたいです。

何らかのウインドウ・メッセージが飛んでくるのでしょうか?



この記事に返信する


いののて

リンク

2018/8/15(Wed) 23:29:12|NO.85088

全画面になってもウィンドウメッセージは送られてきませんので、自分で定期的にアクティブウィンドウを監視するしかありません。
ほぼ全てのソフトの全画面表示はタイトルバー非表示 + 画面いっぱいにリサイズで行っているため、それを条件にするとうまく検出できると思います。

#include "user32.as"
#define GWL_STYLE (-16) #define WS_DLGFRAME 0x00400000 dim rc, 4 repeat hnd = GetForegroundWindow() //アクティブウィンドウへのウィンドウハンドル取得 GetWindowRect hnd, varptr(rc) //ウィンドウサイズ取得 //ウィンドウスタイルのWS_DLGFRAMEフラグが立っていないかつ、ウィンドウが画面いっぱいに表示されているときに全画面と判断 if ((GetWindowLong(hnd, GWL_STYLE) & WS_DLGFRAME)==0 && rc(0)<=0 && rc(1)<=0 && rc(2)>=ginfo_dispx && rc(3)>=ginfo_dispy){ //全画面表示モード時の処理 gsel 0, -1 }else{ //肥前画面モード時の処理 gsel 0, 2 } wait 10 loop

成功:IE、MS Edge、VLC media player、Win10のアプリ(UWP)
失敗:MS Office、Windows Media Player



科学太郎

リンク

2018/8/16(Thu) 16:51:32|NO.85095

> 全画面になってもウィンドウメッセージは送られてきませんので、
> 自分で定期的にアクティブウィンドウを監視するしかありません。
残念!!

> ほぼ全てのソフトの全画面表示はタイトルバー非表示 + 画面いっぱいにリサイズで行っているため、
> それを条件にするとうまく検出できると思います。
処理が重たくなりそうですね。

教えてもらったサンプルを実行してみました。

成功:IE、RealPlayer、YouTube 失敗:ニコニコ動画
という結果でしたね。

とりあえずは、まずまずの結果なので、この方法で実装していきます。

「いののて」さん。
ありがとうございました。



いののて

リンク

2018/8/16(Thu) 20:32:47|NO.85097

もう解決済みになっていますが、このスクリプトのままでは
デスクトップ画面がアクティブになったときにウィンドウが非表示になってしまいます。
そのため、explorer.exe所有のウィンドウを無視するように修正しました。

#module
#include "kernel32.as" #uselib "psapi.dll" #func GetProcessImageFileName "GetProcessImageFileNameA" int, int, int //プロセスIDから実行ファイルへのパスを取得する関数 by inonote #defcfunc GetImageFileNameFromPID int pid sdim path, 0x200 sdim DeviceName sdim buf, 20 dim hProcess dim index //プロセスハンドルを取得 hProcces = OpenProcess(0x001FFFFF/*PROCESS_ALL_ACCESS*/, 0, pid) if (hProcces == "") : return "" //イメージファイル名を取得 GetProcessImageFileName hProcces, varptr(path), 0x200 - 1 if (bDeviceNameTable_Initialized==0){ //デバイス名をドライブレターに変換するテーブルを作成 sdim DeviceNameTable, 0x50, 32 buf="*:" repeat 32 poke buf, 0, 'A' + cnt QueryDosDevice varptr(buf), varptr(DeviceNameTable(cnt)), 0x50 - 1 loop bDeviceNameTable_Initialized = 1 } //デバイス名をドライブレターに変換 //デバイス名を切り出し index = 0 repeat 3 index += instr(path, index, "\\") index++ loop if (index!=-1){ DeviceName = strmid(path, 0, index - 1) repeat 32 if (DeviceName == DeviceNameTable(cnt)){ //置き換え path = "*:\\" + strmid(path, index, strlen(path)-index) poke path, 0, 'A' + cnt break } loop } //後始末 CloseHandle(hProcces) return getpath(path, 16) #global #include "user32.as" #define PATH_EXPLORER (getpath(dir_win+"\\explorer.exe", 16)) #define GWL_STYLE (-16) #define WS_DLGFRAME 0x00400000 dim rc, 4 dim dwPID repeat hnd = GetForegroundWindow() //アクティブウィンドウへのウィンドウハンドル取得 GetWindowRect hnd, varptr(rc) //ウィンドウサイズ取得 GetWindowThreadProcessId hnd, varptr(dwPID) //ウィンドウが属するプロセスのID取得 //ウィンドウスタイルのWS_DLGFRAMEフラグが立っていないかつ、ウィンドウが画面いっぱいに表示されているときに全画面と判断 //追加 : explorer.exe の全画面を無視 if ((GetWindowLong(hnd, GWL_STYLE) & WS_DLGFRAME)==0 && rc(0)<=0 && rc(1)<=0 && rc(2)>=ginfo_dispx && rc(3)>=ginfo_dispy && GetImageFileNameFromPID(dwPID)!=PATH_EXPLORER){ //全画面表示モード時の処理 gsel 0, -1 }else{ //非全画面モード時の処理 gsel 0, 2 } wait 10 loop stop



科学太郎

リンク

2018/8/16(Thu) 20:48:38|NO.85099

> デスクトップ画面がアクティブになったときにウィンドウが非表示になってしまいます。
あっ!
本当ですね。

新しいサンプルは改良されてますね。



いののて

リンク

2018/8/16(Thu) 21:31:47|NO.85100

今気付いたのですが、
GetImageFileNameFromPID 関数内の
「if (hProcces == "") : return ""」を「if (hProcces == 0) : return ""」
に置き換えてから使って下さい。



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