Что нового

ShellExecute не запускает программу если экран погас (windows 7)

greg6

Новичок
Сообщения
7
Репутация
1
Оставил работать на ночь скрипт, утром заметил что запуска программы не было, в чем может быть проблема? Компьютер в сон не переходил, стояло только потушить экран, пример кода, который используется:

Код:
;ждать файла
     $shet=0
	 while FileExists("C:\Users\Greg\Desktop\file1.xlsx")=0
     if($shet<100) Then
	 sleep(1000)
     $shet=$shet+1
     Else
	 scan()
	 EndIf
     wend
     sleep(300)

ShellExecute("EXCEL.EXE", "/e C:\Users\Greg\Desktop\file1.xlsx", "C:\Program Files\Microsoft Office\Office14","", @SW_HIDE)
	;ждем окна excel
	while WinExists("Microsoft Excel")=0
		sleep(500)
	wend
	$hWnd = WinGetHandle('Microsoft Excel')
	while $hWnd = ''
	sleep(1000)
	$hWnd = WinGetHandle('Microsoft Excel')
	wend
	winmove("Microsoft Excel","",5000,5000,5200,5200,10000)
	WinSetState("Microsoft Excel","", @SW_SHOWNA)
	sleep(500)
	 ;вызов макросов в Excel
        $hWnd = WinGetHandle('Microsoft Excel')
	_WinAPI_SetKeyboardLayout($hWnd,'0x0409')
	sleep(10000)
	ControlClick("[CLASS:XLMAIN]","", "[CLASS:EXCEL7; INSTANCE:1]", "left",1,490,100); будим Excel щелчком
	sleep(700)
	ControlSend("[CLASS:XLMAIN]","", "[CLASS:EXCEL7; INSTANCE:1]","^q")
    ProcessWaitClose ("EXCEL.EXE")


Есть идеи?
Операционка Windows 7, программа была запущена от админа.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А что же ночью делала функция scan() ?
:shaman_s_bubnom: :scratch: :shaman_s_bubnom:
 
Автор
G

greg6

Новичок
Сообщения
7
Репутация
1
C2H5OH сказал(а):
А что же ночью делала функция scan() ?
:shaman_s_bubnom: :scratch: :shaman_s_bubnom:

Функция scan() запускала кнопки в парсере для создания файла file1.xlsx, к ней претензий нет, по дате проверил что создавался файлик. А вот файл, который сохраняется после выполнения макроса в excel не обновил дату создания(как и инфу в себе). Вечером смотрел - все работало как надо, пока подозрения на функцию Shell.

OffTopic:
Есть маааааленькие подозрения на макрос, уже начал проверять, но маловероятно.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Вот если бы
Код:
;ждать файла
     $shet=0
     while FileExists("C:\Users\Greg\Desktop\file1.xlsx")=0
     if($shet<100) Then
     sleep(1000)
     $shet=$shet+1
     Else
     scan()
     EndIf
     wend
     sleep(300)
	 
; <===================== ЗДЕСЬ

ShellExecute("EXCEL.EXE", "/e C:\Users\Greg\Desktop\file1.xlsx", "C:\Program Files\Microsoft Office\Office14","", @SW_HIDE)

; <===================== ЗДЕСЬ

    ;ждем окна excel
    while WinExists("Microsoft Excel")=0
        sleep(500)
    wend
    $hWnd = WinGetHandle('Microsoft Excel')
    while $hWnd = ''
    sleep(1000)
    $hWnd = WinGetHandle('Microsoft Excel')
    wend
    winmove("Microsoft Excel","",5000,5000,5200,5200,10000)
    WinSetState("Microsoft Excel","", @SW_SHOWNA)
    sleep(500)
     ;вызов макросов в Excel
        $hWnd = WinGetHandle('Microsoft Excel')

; <===================== ЗДЕСЬ

    _WinAPI_SetKeyboardLayout($hWnd,'0x0409')

; <===================== ЗДЕСЬ

    sleep(10000)
    ControlClick("[CLASS:XLMAIN]","", "[CLASS:EXCEL7; INSTANCE:1]", "left",1,490,100); будим Excel щелчком

; <===================== и ЗДЕСЬ

    sleep(700)
    ControlSend("[CLASS:XLMAIN]","", "[CLASS:EXCEL7; INSTANCE:1]","^q")
    ProcessWaitClose ("EXCEL.EXE")
стояли бы какие-нибудь
Код:
ConsoleWrite("point N"&@CRLF)

то можно было бы не гадать.
А так :shaman_s_bubnom:
 
Автор
G

greg6

Новичок
Сообщения
7
Репутация
1
C2H5OH сказал(а):
Вот если бы стояли бы какие-нибудь
Код:
ConsoleWrite("point N"&@CRLF)

то можно было бы не гадать.
А так :shaman_s_bubnom:

Спасибо за совет, попробую вечером, если не разберусь - продолжу тему, скину что пишет. :ok:


Добавлено:
Сообщение автоматически объединено:

Разобрался, проблема в функции scan, а точнее:

Код:
$WinTitle=ControlGetHandle("Datacol","","[NAME:gcProcess]")
	Opt("pixelcoordmode",2)
	$notactive=hex(_PixelGetColorEx(180,31,ControlGetHandle("Datacol","","[NAME:gcProcess]")),6)
	 while($notactive<>"EFF0F2")
	    $notactive=hex(_PixelGetColorEx(180,31,$WinTitle),6)
	 sleep(5000)
	 Wend


Есть два таких цикла. По непонятным причинам(судя по тому что нашел на форуме) происходит переполнение буфера и функция перестает работать(причем до 2 цикла она не доходит, застревает на первом). Она нужна для определения того, что в парсере начался/закончился процесс парсинга.
Как почистить буфер?

Или второй вариант: как определить совпадает ли цвет точки конкретной? Нашел похожие примеры через битмап на сайте, но сложно для понимания если честно(


Разобрался, тему можно закрывать. Ошибка была в функции _PixelGetColorEx. Я скопировал не полную версию с форума, без нужной строчки - итог - буфер не чистился.
Строчка которой не хватало:

Код:
_WinAPI_DeleteObject($hBMP) ; очищаем битовый массив
 
Верх