Flasher
Вернул WinRestore.
Хотя заметил 1 глюк: развернутое таким способом окно скайпа не закрываеться нажатием на крестик, пока не кликнеш дважды по иконке скайпа в трее.
Решение уже есть, но получается несколько длинее:
SetTitleMatchMode, 2 ; ищет по части названия.
loop {
DetectHiddenWindows, Off ; отключает поиск скрытых окон.
WinWaitClose, Skype ; ждет пока не закроется окно скайпа.
DetectHiddenWindows, On ; включает поиск скрытых окон.
PostMessage2TrayIconProcName("skype.exe", WM_LBUTTONDBLCLK := 0x203) ; дважды кликает по иконке в трее
}
Return
; http://forum.script-coding.com/viewtopic.php?id=10144#pc88239
PostMessage2TrayIconProcName(ProcessName, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
, PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2
oWMI := ComObjGet("winmgmts:")
DHW_Prev := A_DetectHiddenWindows
DetectHiddenWindows, On
Loop 2
{
ControlGet, hWnd, hwnd,, ToolbarWindow321, % "ahk_class " . (A_Index = 1 ? "Shell_TrayWnd" : "NotifyIconOverflowWindow")
WinExist("ahk_id" hWnd)
WinGet, PID, PID
if (A_Index = 1 && !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA))) {
DetectHiddenWindows, %DHW_Prev%
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось создать удалённый буфер`nОшибка " A_LastError, Str, "", UInt, 0)
}
SendMessage, TB_BUTTONCOUNT
Loop % ErrorLevel
{
SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
|| !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
DetectHiddenWindows, %DHW_Prev%
Return
}
WinGet, PID, PID, % "ahk_id" hWnd := NumGet(pTRAYDATA+0)
CurrentProcessName := oWMI.Get("Win32_Process.Handle=" PID).Name
if (CurrentProcessName = "AutoHotkey.exe")
{
WinGetTitle, Title, % "ahk_id" hWnd
CurrentProcessName := RegExReplace(Title, "i).*\\(.*) - autohotkey v[\.\d]+", "$1")
}
if (CurrentProcessName = ProcessName)
{
uID := NumGet(pTRAYDATA + PtrSize, "UInt")
uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, "UInt")
for i, message in messages
PostMessage, uCallbackMessage, uID, message,, % "ahk_id" hWnd
DetectHiddenWindows, %DHW_Prev%
Return
}
}
}
DetectHiddenWindows, %DHW_Prev%
MsgBox, % "Иконка процесса " . ProcessName . " не найдена"
}
Class RemoteBuffer
{
__New(PID, size)
{
static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
Return
if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
Return, "", DllCall("CloseHandle", Ptr, this.hProc)
}
__Delete()
{
DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
DllCall("CloseHandle", Ptr, this.hProc)
}
Read(size, offset = 0)
{
static LocalBuff
VarSetCapacity(LocalBuff, size, 0)
if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка " A_LastError, Str, "", UInt, 0)
VarSetCapacity(LocalBuff, -1)
Return &LocalBuff
}
Write(pLocalBuff, size, offset = 0)
{
res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
Return res ? res : 0, (!res) ? DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка " A_LastError, Str, "", UInt, 0)
}
}
И по кнопке:
F1::
SetTitleMatchMode, 2
DetectHiddenWindows, On
PostMessage2TrayIconProcName("skype.exe", WM_LBUTTONDBLCLK := 0x203)
Return
; http://forum.script-coding.com/viewtopic.php?id=10144#pc88239
PostMessage2TrayIconProcName(ProcessName, messages*)
{
/*
Структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23
, PtrSize := A_Is64bitOS ? 8 : 4, SizeOfTBBUTTON := 8 + PtrSize*3, SizeOfTRAYDATA := 16 + PtrSize*2
oWMI := ComObjGet("winmgmts:")
DHW_Prev := A_DetectHiddenWindows
DetectHiddenWindows, On
Loop 2
{
ControlGet, hWnd, hwnd,, ToolbarWindow321, % "ahk_class " . (A_Index = 1 ? "Shell_TrayWnd" : "NotifyIconOverflowWindow")
WinExist("ahk_id" hWnd)
WinGet, PID, PID
if (A_Index = 1 && !IsObject(RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA))) {
DetectHiddenWindows, %DHW_Prev%
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось создать удалённый буфер`nОшибка " A_LastError, Str, "", UInt, 0)
}
SendMessage, TB_BUTTONCOUNT
Loop % ErrorLevel
{
SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
if ! ( pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON) )
|| !pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr) {
DetectHiddenWindows, %DHW_Prev%
Return
}
WinGet, PID, PID, % "ahk_id" hWnd := NumGet(pTRAYDATA+0)
CurrentProcessName := oWMI.Get("Win32_Process.Handle=" PID).Name
if (CurrentProcessName = "AutoHotkey.exe")
{
WinGetTitle, Title, % "ahk_id" hWnd
CurrentProcessName := RegExReplace(Title, "i).*\\(.*) - autohotkey v[\.\d]+", "$1")
}
if (CurrentProcessName = ProcessName)
{
uID := NumGet(pTRAYDATA + PtrSize, "UInt")
uCallbackMessage := NumGet(pTRAYDATA + PtrSize + 4, "UInt")
for i, message in messages
PostMessage, uCallbackMessage, uID, message,, % "ahk_id" hWnd
DetectHiddenWindows, %DHW_Prev%
Return
}
}
}
DetectHiddenWindows, %DHW_Prev%
MsgBox, % "Иконка процесса " . ProcessName . " не найдена"
}
Class RemoteBuffer
{
__New(PID, size)
{
static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
Return
if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
Return, "", DllCall("CloseHandle", Ptr, this.hProc)
}
__Delete()
{
DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
DllCall("CloseHandle", Ptr, this.hProc)
}
Read(size, offset = 0)
{
static LocalBuff
VarSetCapacity(LocalBuff, size, 0)
if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка " A_LastError, Str, "", UInt, 0)
VarSetCapacity(LocalBuff, -1)
Return &LocalBuff
}
Write(pLocalBuff, size, offset = 0)
{
res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
Return res ? res : 0, (!res) ? DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка " A_LastError, Str, "", UInt, 0)
}
}