【伺か】SSPにおいてウィンドウとして選択されているかどうかを比較できるようにした。【yaya】
ukagaka現在のウィンドウハンドルを返すだけのコードを書いた。
using System;
using System.Runtime.InteropServices;
class Win32Api {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
}
public class Hello{
public static void Main(){
IntPtr forehWnd = Win32Api.GetForegroundWindow();
//now window handow
Console.WriteLine( forehWnd );
}
}
下記に置いているので自己責任でお使い下さい。
exe化しておいたものはこちら:OneDrive
また、呼び出しにproxy_ex.dllを使用しています。
下記の方からお借りしました。
Release SAORI : proxy_ex v1.0.2 · ponapalt/csaori · GitHub
ファイル構成
ghost名/ghost/master
├─yaya.dll
├─dll
│ ├─proxy_ex.dll
│ └─ukagakaExe_getForeWindow
│ └─getWindowHandle.exe
└─profile
SSP/yayaから現在選択されているウィンドウを確認する。
基幹部分
//0 : ghost ウィンドウハンドル
//1 : バルーン
On_hwnd{
hwnd = reference[0]
_word = REPLACE( hwnd , " " , "" )
_word_len = STRLEN( _word )
_i = -1
hwnd_ssp = ""
hwnd_ghost = ""
_changeFlag = 0
while _i < _word_len {
_i++
_one = SUBSTR( _word , _i , 1)
_check = RE_MATCH( _one , "[0-9]" )
if _check != 0 {
if ( _changeFlag == 0 ){
hwnd_ssp = hwnd_ssp + _one
}else{
hwnd_ghost = hwnd_ghost + _one
}
}else{
_changeFlag = 1
}
}
}
//既存関数に追加しておく
OnGhostLoad {
loadHwnd
}
//既存関数に追加しておく
OnGhostUnload {
UnloadHwnd
}
loadHwnd{
if ISVAR( 'WindowFlag' ) == 0 {
WindowFlag = 1
}
}
UnloadHwnd{
ERASEVAR( 'hwnd' )
ERASEVAR( 'hwnd_ssp' )
ERASEVAR( 'hwnd_ghost' )
ERASEVAR( 'WindowFlag' )
}
実装例
//一秒ごとに現在フォーカスが当たっているか確認して通知する。
//WindowFlagを設定し、切り替わったタイミングのみ通知する。
OnSecondChange {
_nowWindowHandle = FUNCTIONEX( "./dll/proxy_ex.dll" , "./ukagakaExe_getForeWindow/getWindowHandle.exe" )
//現在SSPにフォーカスが当たっている。
if ( TOINT(_nowWindowHandle) == TOINT(hwnd_ssp) && WindowFlag == 0 ) {
WindowFlag = 1
"呼んだ?"
}elseif ( TOINT(_nowWindowHandle) != TOINT(hwnd_ssp) ) {
WindowFlag = 0
//"ssp_window =%(hwnd_ssp)X current_window =%(_nowWindowHandle)"
}
}
実装における小言。
キーボードオンリーによって実用的な伺かGhostを作成している途中なのだが、
切り替えが視覚的にわかるようにアニメーションを付けようと思った。
ただフォーカスを切り替えるだけなら全く問題ないのだが、click判定を付けるときなど、判定がほぼ同時に発生しうることがあり
ここで供養することになった。
もしよければご利用ください。