forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Для тех, кому в блице внезапно не хватило браузера, word и тд (http://forum.boolean.name/showthread.php?t=20443)

DarkInside 18.10.2016 20:41

Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Вложений: 2
В общем, для любителей извращений с блицем, если вам внезапно в окне блица понадобился браузер, Word, блокнот, косынка и пасьянс :-D

Код AutoIt 3.3.14.2:
Код:

#NoTrayIcon

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#Include <Word.au3>

Opt("WinTitleMatchMode", 3)

$eXn = @ScriptDir & '\bin.exe'
$lPn = 'SCL.auto'

$aRet = _GetDesktopWorkArea()

If Not WinExists($lPn) Then

        if _WinAPI_GetVersion() = 10 then
                $dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
                $dh = _WinAPI_GetSystemMetrics(17) - _WinAPI_GetSystemMetrics(6) - _WinAPI_GetSystemMetrics(7)
                ShellExecute ($eXn, string($dw) & "/" & string($dh))
                WinMove (WinWaitactive($lPn), "", $aRet[0] - 2 * _WinAPI_GetSystemMetrics(6), $aRet[1])
        Else
                $dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
                $dh = _WinAPI_GetSystemMetrics(17) - 2 * _WinAPI_GetSystemMetrics(7)
                ShellExecute ($eXn, string($dw) & "/" & string($dh))
                WinMove (WinWaitactive($lPn), "", $aRet[0] - 2 * _WinAPI_GetSystemMetrics(6), $aRet[1] + _WinAPI_GetSystemMetrics(7))
        EndIf

        $GUI = WinGetHandle ($lPn)

        _WinAPI_SetWindowLong($GUI, $GWL_STYLE, bitor(_WinAPI_getWindowLong($GUI, $GWL_STYLE), $WS_CLIPCHILDREN))

        Opt("WinTitleMatchMode", 1)

        $oWordApp = _Word_Create (0, 0)
        $hWnd = WinWait ("Microsoft Word")
        _WinAPI_SetWindowLong($hWnd, $GWL_EXSTYLE, $WS_EX_TOOLWINDOW)
        _Word_DocOpen($oWordApp, @ScriptDir & "\test.docx")
        _WinAPI_SetWindowLong($hWnd, $GWL_STYLE, $WS_POPUP)

        _WinAPI_MoveWindow($hWnd, 0, 0, 200, 200)
        _WinAPI_SetWindowLong($hWnd, $GWL_STYLE, BitOR($WS_CHILD, $WS_TABSTOP, $WS_VISIBLE))

        _WinAPI_SetParent($hWnd, $GUI)
        _WinAPI_MoveWindow($hWnd, 0, 61, $dw - $dw / 5, $dh - 61)

        _WinAPI_UpdateWindow($GUI)
        _WinAPI_UpdateWindow($hWnd)

        ;$iTimer = TimerInit()
        _WinAPI_InvalidateRect($GUI)

        While WinExists($lPn)

                ;If TimerDiff($iTimer) >= 500 Then
                ;        $iTimer = TimerInit()
                ;        _WinAPI_InvalidateRect($GUI)
                ;EndIf

        Wend

        _Word_Quit($oWordApp)

Else

        WinSetState ($lPn, '', @SW_SHOW & @SW_RESTORE)
        WinActivate($lPn)

EndIf

Func _GetDesktopWorkArea()

    Local Const $SPI_GETWORKAREA = 48
    Local $sRect = DllStructCreate($tagRECT)

    If _WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($sRect)) Then
        Local $aRet[4] = [ _
        DllStructGetData($sRect, "Left"), _
        DllStructGetData($sRect, "Top"), _
        DllStructGetData($sRect, "Right"), _
        DllStructGetData($sRect, "Bottom")]
        Return SetError(0, 0, $aRet)
    EndIf
    Return SetError(1, 0, 0)
EndFunc  ;==>_GetDesktopWorkArea


Вкратце что делаем:
1. При открытии окна блица надо добавить к нему стиль WS_CLIPCHILDREN операцией бинарного ИЛИ к уже существующим стилям - это для того, чтобы блиц не перерисовывал область дочернего окна.
2. При запуске потенциального дочернего окна назначаем ему стиль WS_EX_TOOLWINDOW, чтобы он не мелькал в панели задач, а потом назначаем WS_POPUP, чтобы убрать рамку.
3. Переназначаем дочернему окну стили WS_CHILD и WS_VISIBLE - дочернее и видимое (тк по умолчанию окно будет скрыто после предыдущих операций).
4. Назначаем родителя SetParent, обновляем окна, посылая ему WM_PAINT, тут начинается лабуда из-за очередности прорисовки окон в винде, чтобы этой лабуды не было, назначаем InvalidateRect.

PS. Универсальную dll не стал делать, т.к. каждое приложение имеет свои особенности, лучше подгонять отдельно - править скрипт autoit.
PS2. Почему блиц? Мне нужна 3D сцена, которая создается считывая данные из документа Word, которые при этом правятся. В общем, из 3D движков я работал только с блицем, мне проще взять его и не париться.

Потестите пример (run.exe), у всех дочернее окно ворда нормально отрисовывается?
Проверял на Win 7 и 10 х64, офис 2010.

ABTOMAT 18.10.2016 23:29

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Запустил, появляется Малевич маленький и закрывается тут же.
Винда 10 (обновления последние), офис 2010

DarkInside 18.10.2016 23:57

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Цитата:

Сообщение от ABTOMAT (Сообщение 309325)
Запустил, появляется Малевич маленький и закрывается тут же.
Винда 10 (обновления последние), офис 2010

Хм, а ты run.exe запускал? или bin.exe?

bin напрямую не запустится (Graphics3d запускается запускается с параметрами командной строки), которые передает run.

Код:

AppTitle "SCL.auto"

param$ = CommandLine$()

num_p = parsecount (param$, "/", 0)

If num_p <> 2 Then End

dw = Int(parse$(param$, "/", 1, 0))
dh = Int(parse$(param$, "/", 2, 0))

Graphics3D dw, dh, 32, 2

Это я так имитирую развернутое окно. run берет системные метрики: из клиентской области рабочего стола минусует высоту шапки окна и толщину рамки окна и с этими dw и dh запускает блицевский файл. Поэтому если не запустилось через run.exe, это уже странно...

Код:

$dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
$dh = _WinAPI_GetSystemMetrics(17) - _WinAPI_GetSystemMetrics(6) - _WinAPI_GetSystemMetrics(7)
ShellExecute ('bin.exe', string($dw) & "/" & string($dh))


Arton 19.10.2016 00:42

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
У меня появляется тоже что на скрине выше.
Не разбирался, но прикольно.
Блиц жив!

P. S. Win7 x64 SP1

DarkInside 19.10.2016 01:07

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Вложений: 1
Цитата:

Сообщение от Arton (Сообщение 309328)
Блиц жив!

Это фигня, мне тут нужно web-приложение для малого количества пользователей (около 10-20), я вот думаю, может нафиг изучать канвасы, webGL и тд. Сделать быстрый стриминг: запускать блиц на серваке в отдельной песочнице для каждого пользователя, картинку разбивать на много сегментов по форме гуи и отправлять пользователю только те сегменты, которые изменились (сжимать их хорошенько). А у пользователя показывать эти сегменты в браузере. По идее в стриминге игр (через видео) проблема в том, что изображение динамично меняется, а в стриминге программ вообще с этим проблем не должно быть. :-D Фотошоп же стримили подобным образом. А действия в гуи вообще часто повторяются, поэтому картинку можно держать в кэше, анимации оставить минимум... И на смартфон таким же образом портировать через браузерное приложение. :crazy:
PS. Я не упоротый, просто меня в дрожь бросает от современного фронтенда https://habrahabr.ru/post/312022/

Это можно в отдельную тему - как сделать сайт на блице...

UPD: Опередили меня http://evoclouds.com/, не говоря уже о корпоративных решениях Citrix XenApp и Microsoft App-V.

Ну а чему тут удивляться, когда Microsoft запилила ядро Linux в Windows 10 и допиливает приложение для портирования iOS и Android приложений в винду за 5 минут, а Google запускает приложения Android в браузере. Виртуализация! :super:

Из тех, что я нашел, лучше всего показался этот сервис https://www.rollapp.com/ Выдерживает большой поток пользователей, есть бесплатная версия. Но видно по артефактам, что картинка перерисовывается полностью и анимация приложений не упрощается и гуи не кэшируется, значит в принципе можно еще ускорить и избавиться от артефактов при этом.

Кто-нибудь встречался с сервисами лучше?

Блендер в браузере:

RegIon 19.10.2016 06:03

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 

Все же думают, что он только усложняет себе жизнь?

Тебе нужен VDS сервер на винде, но беда - не у всех есть видеоускорители (или дороговато), а у сервисов, типа который ты нашел - так вообще редкость.
Т.е твоя прога на нем даже не стартанет=)
Не усложняй.
Вон, мока тебе сейчас PlayCanvas посоветует. Хотя он пропал куда-то.

DarkInside 19.10.2016 06:19

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Цитата:

Сообщение от RegIon (Сообщение 309334)
Тебе нужен VDS сервер на винде, но беда - не у всех есть видеоускорители (или дороговато), а у сервисов, типа который ты нашел - так вообще редкость.
Т.е твоя прога на нем даже не стартанет=)
Не усложняй.
Вон, мока тебе сейчас PlayCanvas посоветует. Хотя он пропал куда-то.

Не, это я просто смотрю, какие есть сервисы и что они предлагают. Если бы я такое делал, то на своем серваке - на работе стоит с двумя xeon e5 2620 и tesla c2075 (старенькая, конечно, но поток для 20 пользователей сжимать пойдет с каким-нибудь продвинутым кодеком). Бэкенд в любом случае под виндой. А для фронтенда лень разбираться с html5, канвасом (хотя там вроде просто всё), да и есть уже по тому приложению наработки по интерфейсу, заново делать придется. А то, что я предлагаю - это по сути 200 строчек кода в совокупности.

В общем, надо подумать...с другой стороны канвас тоже интересно изучить.

Владислав 04.11.2016 12:58

Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд
 
Win7, все работает, здорово!


Часовой пояс GMT +4, время: 05:40.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot