二重起動防止を応用して・・・
http://yokohama.cool.ne.jp/chokuto/urawaza/doubleexe2.html
http://yokohama.cool.ne.jp/chokuto/urawaza/commonmem1.html
#uselib "kernel32.dll"
#func CreateFileMapping "CreateFileMappingA" sptr, sptr, sptr, sptr, sptr, sptr
#func MapViewOfFile "MapViewOfFile" sptr, sptr, sptr, sptr, sptr
#func UnmapViewOfFile "UnmapViewOfFile" sptr
#func GetLastError "GetLastError"
#func CloseHandle "CloseHandle" sptr
#func RtlMoveMemory "RtlMoveMemory" sptr, sptr, sptr
#uselib "user32.dll"
#func PostMessage "PostMessageA" sptr, sptr, sptr, sptr
#define WM_USER_DUPEXEC 0x0401 ;二重起動を知らせるメッセージを定義
onexit *exit
oncmd gosub *dupexec, WM_USER_DUPEXEC
CreateFileMapping -1, 0, 4, 0, 260, "myappname" ;マッピングオブジェクト作成
hmapobj = stat
GetLastError
existflg = stat
MapViewOfFile hmapobj, 2, 0, 0, 0 ;マッピング
pmapobj = stat
if existflg = 183 { ;二重起動だった場合
cmdline = dir_cmdline
RtlMoveMemory pmapobj+4, varptr(cmdline), 256 ;共有メモリにコマンドライン文字列を格納
hwindow = 0
RtlMoveMemory varptr(hwindow), pmapobj, 4 ;共有メモリから初回起動ウィンドウハンドルを取得
PostMessage hwindow, WM_USER_DUPEXEC, 0, 0 ;二重起動されたことを初回起動ウィンドウに通知
UnmapViewOfFile pmapobj
CloseHandle hmapobj
end
} else { ;初回起動だった場合
hwindow = hwnd
RtlMoveMemory pmapobj, varptr(hwindow), 4 ;共有メモリにウィンドウハンドルを格納
stop
}
*dupexec ;初回起動ウィンドウが二重起動通知を受けたときの処理
sdim cmdline, 256
RtlMoveMemory varptr(cmdline), pmapobj+4, 256 ;共有メモリからコマンドライン文字列を取得
mes cmdline
return
*exit
UnmapViewOfFile pmapobj
CloseHandle hmapobj
end