Что нового

Создание окна, невидимого в панели задач и по Alt+Tab

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Метод создания окна, имеющего стандартный заголовок и не "светящегося" в панели задач и в панели выбора приложения (Alt+Tab). Аналогичного апплетам контрольной панели (Control Panel) в Windows. Для запуска необходима WinAPIEx.au3 библиотека.


Код:
#NoTrayIcon

#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Global $hParent, $hForm, $hIcon

$hParent = GUICreate('', 0, 0, 0, 0, 0, $WS_EX_TOOLWINDOW)
$hForm = GUICreate('MyGUI', 400, 400, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_DLGMODALFRAME, $hParent)

$hIcon = _WinAPI_GetClassLong($hForm, $GCL_HICON)
_WinAPI_FreeIcon($hIcon)
_WinAPI_SetClassLong($hForm, $GCL_HICON, 0)
_WinAPI_SetClassLong($hForm, $GCL_HICONSM, 0)

GUISetState()

Do
Until GUIGetMsg() = -3
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
156
И пример стоит обновить под WinAPIEx v3.1
Код:
#NoTrayIcon

#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Global $hParent, $hForm, $hIcon

$hParent = GUICreate('', 0, 0, 0, 0, 0, $WS_EX_TOOLWINDOW)
$hForm = GUICreate('MyGUI', 400, 400, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_DLGMODALFRAME, $hParent)

$hIcon = _WinAPI_GetClassLongEx($hForm, $GCL_HICON)
_WinAPI_DestroyIcon($hIcon)
_WinAPI_SetClassLongEx($hForm, $GCL_HICON, 0)
_WinAPI_SetClassLongEx($hForm, $GCL_HICONSM, 0)

GUISetState()

Do
Until GUIGetMsg() = -3
 

darkwhite

Чайник
Сообщения
129
Репутация
4
код выдает ошибку
Код:
C:\Program Files\AutoIt3\Include\WinAPIEx.au3(7835,104) : ERROR: _WinAPI_DuplicateHandle() already defined.
Func _WinAPI_DuplicateHandle($hProcess, $hSource, $hTarget, $iAccess = 0, $iOptions = 2, $fInherit = 0)
использую версию 3.3.8.1 winAPI 3.7 поглядел вроде дублирования не нашел (
в чем проблема ?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Скачайте WinAPEx для соответствующей версии AutoIt.
 

darkwhite

Чайник
Сообщения
129
Репутация
4
вот я дурноййййй )) спасибо ) :beer:
теперь ругается на необъявленные переменные $GCL_HICON $GCL_HICONSM))

а в чем отличие все таки ) данная функция уже включаена в версию 3.3.8.1 ?
вижу коментарий что функция включена в WinAPI, но ведь мы ее не инклюдили

PS и возник вопросик )
зачем этот кусок кода ?
Код:
$hIcon = _WinAPI_GetClassLong($hForm, $GCL_HICON)
_WinAPI_FreeIcon($hIcon)
_WinAPI_SetClassLong($hForm, $GCL_HICON, 0)
_WinAPI_SetClassLong($hForm, $GCL_HICONSM, 0)

ведь окно не видно и без них
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
darkwhite сказал(а):
теперь ругается на необъявленные переменные $GCL_HICON $GCL_HICONSM))
Нужно добавить

Код:
#Include <APIConstants.au3>


darkwhite сказал(а):
а в чем отличие все таки данная функция уже включаена в версию 3.3.8.1 ?
Да.

darkwhite сказал(а):
зачем этот кусок кода ?
Освобождает память, занимаемую неиспользуемыми иконками.
 

Loveц

Чайник
Сообщения
16
Репутация
1
Можно ли то же самое (или частично) сделать с чужим окном?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
356
Loveц
Частично точно можно.

Вот так окно блокнота не видно при нажатии Alt+Tab:
Код:
#include <WindowsConstants.au3>

Run('notepad', '', @SW_SHOW)

WinWait('[CLASS:Notepad]')
$hWnd = WinGetHandle('[CLASS:Notepad]')

_WinSetStyle($hWnd, -1, BitOR($WS_POPUP, $WS_EX_TOOLWINDOW)) ; Функция изменения стиля окна

Func _WinSetStyle($hWnd, $nStyle = -1, $nExStyle = 0)
    Local Const $GWL_STYLE = -16, $GWL_EXSTYLE = -20
    Local Const $SWP_NOMOVE = 0x2, $SWP_NOSIZE = 0x1, $SWP_SHOWWINDOW = 0x40, $SWP_NOZORDER = 0x4
    Local $iFlags = BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOZORDER)

    If $nStyle = -1 Then
        $nStyle = BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
    EndIf
    $Pos = WinGetpos($hWnd)
    $x = $Pos[0]
    $y = $Pos[1]

    DllCall('User32.dll', 'int', 'SetWindowLong', 'hwnd', $hWnd, 'int', $GWL_STYLE, 'int', $nStyle)
    DllCall('User32.dll', 'int', 'SetWindowLong', 'hwnd', $hWnd, 'int', $GWL_EXSTYLE, 'int', $nExStyle)
    DllCall('User32.dll', 'int', 'SetWindowPos', 'hwnd', $hWnd, 'hwnd', 0, 'int', $x + 1, 'int', $y + 1 , 'int', 0, 'int', 0, 'int', $iFlags)
EndFunc
 
Верх