Что нового

Открытка для любимой. Необычная просьба

infant23

Новичок
Сообщения
7
Репутация
0
Версия AutoIt: 3.3.8.0

Описание: Всем привет. У меня будет необычная просьба. Начну с того что я совсем новичок в Аутоите. Пока только примитивные коды пишу. Собственно перейду к просьбе. Впереди у нас 14 февраля - День Всех Влюбленных.:smile: Я бы хотел сделать девушке своеобразный подарок. Надо написать в аутоите скрипт который бы запустил notepad.exe, затем в поле написало "какой то текст"(Я сам напишу это, там опупенно большой текст)). И чтобы скорость печатание этого текста была такой чтобы читатель успел прочесть. После как печатание текста закончится, закрыть notepad.exe, чтобы нажалась кнопка Отмена, при появлении таблички с текстом "Сохранить изменения в Безымянный". Как закончится эта операция, надо чтобы запустился mspaint.exe, затем в нем нарисовал(не знаю как это действие охарактеризовать) цветы, точнее розу. Красную. Как закончится эта операция, дожна выйти MsgBox с текстом "Я ЛЮБЛЮ ТЕБЯ, СОЛНЫШКО". Собственно все. У вас может возникнуть вопрос, "А почему ты сам не купишь цветы и не поздравишь лично". Ответ прост: она в командировке в данный момент. А я с работы не могу вырваться) Буду очень благодарен за помощь. Всем заранее спасибо

Примечания: У нее ОС MS Seven на компе установлен
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
infant23
У вас может возникнуть вопрос, "А почему ты сам не купишь цветы и не поздравишь лично"
У нас скорее возникнет вопрос, зачем привлекать для всего этого Notepad и Mspaint, если все это можно показать в отдельном специальном окне скрипта...
Можно сделать несколько более впечатляюще, чем печать в обычный блокнот...
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
WSWR
Я думал об этом, но думал что сложнее будет чем то, что как я прошу сделать. И потом надо чтобы написанный код был и мне понятен. Я пока в начале знакомства с Аутоитом как уже говорил. Чтобы, если что я сам мог отредактировать это, и уловить суть того что я делаю. Надеюсь ты меня понял)
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
infant23
Код:
MsgBox(64, "Поздравленеие", "С днем рождения, дорогая! Я люблю тебя, солнышко!")

;компилируй и дари
;ей должно понравиться
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
Yuriy
Спасибо. В принципе я бы сам это смог. Но я просил о другом) это не романтично) 8)


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

Zaramot Спасибо за открытку, но там такой код, что офигеть можно :shok:, для меня это пока густой лес. Может есть с кодом попроще?):smile:




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

AZJIO
Спасибо за ссылку. Но такое уже было) ну или что то похожее гуляет по сети. Я хочу чтобы что то необычное было, главное для меня удивить)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
infant23
Если хочется самому разобраться - похвально
Можно начать с чего-то подобного:

Код:
#NoTrayIcon ; Убираем иконку скрипта и трея

Run('notepad.exe') ; Запуск блокнота

WinActivate('[CLASS:Notepad]', '')
WinWaitActive('[CLASS:Notepad]', '') ; Ожидаем окно, выносим его поверх всех
WinSetOnTop('[CLASS:Notepad]', '', 1)

$sText ='С Днем Рождения, дорогая!' & _  ; Текст поздравления
' Я люблю тебя, солнышко!'


$aText = StringSplit($sText,'') ; Разбиваем текст на отдельные символы и кладем в массив
Sleep (1000) ; Пауза
For $i = 1 To $aText[0] ; Цикл 
ControlSend('[CLASS:Notepad]', '', '[CLASS:Edit; INSTANCE:1]', $aText[$i], 1) ; посимвольно посылаем текст в окно блокнота
Sleep (300) ; Пауза
Next


Да, и наверно следует заблокировать ввод, чтобы случайно не закрыла)

С рисованием посложнее, надо подумать)
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
WSWR
Большое спасибо, главное дело пошло, а вот как сделать чтобы после печатания закрыть окно и в появившимся окне нажалось "Не сохранять"? Ну чтобы этот первый Процесс_1(давайте дальше будем называть всю операцию проходящую с Ноутпадом - Процесс_1, а с Пейнтом - Процесс_2) закончился, и начался следующий то есть Процесс_2. Я так понял в твоем коде надо дописать(добавить)
WinClose
WinWaitActivate и передать(Send) нажатие горячих клавиш. Вот с этим тоже надо разобраться) Ребят помогите плиз_)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
infant23
Можно добавить
Код:
Sleep (1000)
ProcessClose('notepad.exe')

Тогда не появится сообщений и файл не сохранится
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
WSWR
:smile: иесс.. че то я не подумал про киллпроцесс) еще раз благодарю)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
infant23
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Администратор.





[?]
Тема решена?
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
CreatoR
Извиняюсь.) пока еще нет. надо со второй частью разобраться
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
infant23

Вот заготовка для скрипта, рисующего в пайнте:
Для начала берем какую-нибудь черно-белую картинку, размером, например, 300х300 пикселей(чем больше - тем дольше обработка). Скрипт загружает ее, преобразует в 2-мерный массив(таблицу) и переходит в ожидание. Далее, если открыть пайнт, включить инструмент "карандаш", и поставить его на белом фоне(размер документа должен быть больше картинки), и нажать "Pause", то скрипт начнет перемещать мышь соответственно структуре массива-таблицы. Принцип похож на принцип работы матричного принтера: там, где в массиве будет "0", будет произведен клик левой кнопкой и появится черная точка, и т.д. Постепенно будет сформировано исходное изображение.

Главная проблема - как изменить работу с массивом, чтобы больше соответствовало рисованию рукой, ну, и также правильно открыть пайнт, чтобы все сработало. Может, кто еще что посоветует.

Саму картинку таскать с собой не надо, ее можно заранее перевести в текстовый формат и загрузка будет происходить быстрее.

Код:
#include <APIConstants.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>

HotKeySet('{Pause}', '_Mo') ; запуск рисования по Pause
HotKeySet('{ESC}', '_Exit') ; выход из скрипта по ESC

$C = 1

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.bmp') ; загрузка изображения

$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

$W = _GDIPlus_ImageGetWidth($hImage) ; получение высоты изображения
$H = _GDIPlus_ImageGetHeight($hImage) ; получение ширины изображения

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

Dim $Matrix[$H / $C][$W / $C] ; 2-мерный массив, в котором будет храниться картинка
Dim $HLS[3]

$hSrcDC = _WinAPI_CreateCompatibleDC(0)
$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap)
$hDstDC = _WinAPI_CreateCompatibleDC(0)
$hDib = _WinAPI_CreateDIB(1, 1)
$hDstSv = _WinAPI_SelectObject($hDstDC, $hDib)
_WinAPI_SetStretchBltMode($hDstDC, $HALFTONE)

For $y = 0 To $H / $C - 1
	For $x = 0 To $W / $C - 1
		_WinAPI_StretchBlt($hDstDC, 0, 0, 1, 1, $hSrcDC, $x * $C, $y * $C, $C, $C, $SRCCOPY)
		$RGB = _WinAPI_GetPixel($hDstDC, 0, 0)
		_WinAPI_ColorRGBToHLS($RGB, $HLS[0], $HLS[1], $HLS[2])
		$Matrix[$y][$x] = $HLS[1]
	Next
Next

_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hSrcDC)
_WinAPI_SelectObject($hDstDC, $hDstSv)
_WinAPI_DeleteObject($hDib)
_WinAPI_DeleteDC($hDstDC)

;_ArrayDisplay($Matrix, 'Luminance')

While 1
	Sleep(50) ; цикл
WEnd

Func _Mo() ; функция рисования
	$pos = MouseGetPos()
	For $y = 0 To $H / $C - 1
		For $x = 0 To $W / $C - 1
			MouseMove($pos[0] + $x, $y + $pos[1], 1)
			If $Matrix[$y][$x] = 0 Then MouseClick('left')
		Next
	Next
EndFunc   ;==>_Mo

Func _Exit()
	Exit
EndFunc   ;==>_Exit


WinAPIEx.au3 и APIConstants.au3 брать здесь http://autoit-script.ru/index.php/topic,47.0.html
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Можно сами движения мышью записать в виде кода, который повторится (перемтить мышь, зажать левую, переместить мышь, отжать левую, ....)
Правда это рутинная работа и на это нужно время, но я думаю у романтика всегда найдется время на такую безделушку

P.S. Главное не забывать вычитывать координаты относительные(относительно окна паинта и контролла)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Несколько переделал, добавил возможность рисования рандомными линиями) (с помощью http://autoit-script.ru/index.php?topic=6462.0 от XpycT-а)
Скорость, конечно, небольшая
Код:
#include <APIConstants.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>

HotKeySet('{Pause}', '_Mo') ; запуск рисования по Pause
HotKeySet('{ESC}', '_Exit') ; выход из скрипта по ESC

$C = 1

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.bmp') ; загрузка изображения

$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

$W = _GDIPlus_ImageGetWidth($hImage) ; получение высоты изображения
$H = _GDIPlus_ImageGetHeight($hImage) ; получение ширины изображения

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

Dim $Matrix[$H / $C][$W / $C] ; 2-мерный массив, в котором будет храниться картинка
Dim $HLS[3]

$hSrcDC = _WinAPI_CreateCompatibleDC(0)
$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap)
$hDstDC = _WinAPI_CreateCompatibleDC(0)
$hDib = _WinAPI_CreateDIB(1, 1)
$hDstSv = _WinAPI_SelectObject($hDstDC, $hDib)
_WinAPI_SetStretchBltMode($hDstDC, $HALFTONE)

For $y = 0 To $H / $C - 1
	For $x = 0 To $W / $C - 1
		_WinAPI_StretchBlt($hDstDC, 0, 0, 1, 1, $hSrcDC, $x * $C, $y * $C, $C, $C, $SRCCOPY)
		$RGB = _WinAPI_GetPixel($hDstDC, 0, 0)
		_WinAPI_ColorRGBToHLS($RGB, $HLS[0], $HLS[1], $HLS[2])
		$Matrix[$y][$x] = $HLS[1]
	Next
Next

_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hSrcDC)
_WinAPI_SelectObject($hDstDC, $hDstSv)
_WinAPI_DeleteObject($hDib)
_WinAPI_DeleteDC($hDstDC)

;_ArrayDisplay($Matrix, 'Luminance')

While 1
	Sleep(50) ; цикл
WEnd

Func _Mo() ; простая функция рисования
	Sleep(2000)
	$pos = MouseGetPos()
	For $y = 0 To $H / $C - 1
		For $x = 0 To $W / $C - 1
			If $Matrix[$y][$x] = 0 Then
				MouseMove($pos[0] + $x, $y - 1 + $pos[1], 1)
				MouseClick('left')
			EndIf
		Next
	Next
EndFunc   ;==>_Mo

;~ Func _Mo() ; функция рисования со случайными линиями
;~ 	Sleep(2000)
;~ 	$aRandom = _RandomEx(1, $H / $C, $H / $C, 1, 1)	
;~ 	$pos = MouseGetPos()
;~ 	For $y = 0 To $H / $C - 1
;~ 		For $x = 0 To $W / $C - 1
;~ 			If $Matrix[$aRandom[$y] - 1][$x] = 0 Then
;~ 				MouseMove($pos[0] + $x, $aRandom[$y] - 1 + $pos[1], 1)
;~ 				MouseClick('left')
;~ 			EndIf
;~ 		Next
;~ 	Next
;~ EndFunc   ;==>_Mo

Func _Exit()
	Exit
EndFunc   ;==>_Exit


; #FUNCTION# ==============================================================================================================
; Name...........: _RandomEx
; Description ...: Function generates a random numbers and displays them in a specified format.
; Syntax.........: _RandomEx($_iSNum, $_iENum, $_iRNumCount, $_iRetFormat, $_sRetDelimiter, $_iUnique)
; Parameters ....: $_iSNum         - The smallest number to be generated. The default is 0.
;                  $_iENum         - The largest number to be generated. The default is 1.
;                  $_iRNumCount    - Quantity of random numbers
;                  $_iRetFormat    - Return format (0 = String (Default), 1 = Array)
;                  $_sRetDelimiter - Random numbers delimeter if return format is string. The default is ","
;                  $_iUnique       - Specified if generated random numbers should be unique (0 = not unique, 1 = unique (Default))
; Return values .: Success - Return random numbers between $_iSNum and $_iENum in specified format.
;                  Failure - 0, sets @error  Returns 0 and sets @error flag to 1 if bad parameters
;                  |1 - $_iSNum equally or greater $_iENum
;                  |2 - Quantity of possible unique random numbers is less requested
; Author ........: XpycT, idea of return in string format madmasles http://autoit-script.ru/index.php/topic,6344.msg44489.html#msg44489
; =========================================================================================================================
Func _RandomEx($_iSNum = 0, $_iENum = 1, $_iRNumCount = 1, $_iUnique = 1, $_iRetFormat = 0, $_sRetDelimiter = ",")
	Local $sRNumStr = "`", $iNumCount = 0
	If $_iSNum >= $_iENum Then Return SetError(1, 0, 0)
	If $_iUnique And($_iENum - $_iSNum + 1) < $_iRNumCount Then Return SetError(2, 0, 0)
	While $iNumCount <> $_iRNumCount
		$iRNum = Random($_iSNum, $_iENum, 1)
		If $_iUnique = 1 Then
			If Not StringInStr($sRNumStr, "`" & $iRNum & "`") Then
				$sRNumStr &= $iRNum & "`"
				$iNumCount += 1
			EndIf
		Else
			$sRNumStr &= $iRNum & "`"

			$iNumCount += 1
		EndIf
	WEnd
	$sRNumStr = StringTrimLeft(StringTrimRight($sRNumStr, 1), 1)
	If $_iRetFormat = 0 Then Return StringReplace($sRNumStr, "`", $_sRetDelimiter)
	If $_iRetFormat = 1 Then Return StringSplit($sRNumStr, "`")
EndFunc   ;==>_RandomEx

Но чем больше будет похоже на рисование - тем медленнее...
 
Автор
I

infant23

Новичок
Сообщения
7
Репутация
0
WSWR Благодарю! :smile:
Но все же я пока процесс с пейнтом не совсем улавливаю(. В первом процессе я как то допер до сути, а вот со второй ни ни.
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.bmp') здесь как я понял нужно прописать имя рисунка ?! Я скопировал в папку со скриптом рисунок(1.bmp) и запустил скрип, с ноутпадом все нормально работает, ноутпад закрывается и все. Дальше ничего не происходит( я думаю надо наверное сперва запустить Пейнт?! Я пробовал, после процесса ноутпада
.............
Sleep (1000)
ProcessClose('notepad.exe')

Run ('mspaint.exe')


#include <APIConstants.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
......
пейнт запускается и ничего не происходит. Я понимаю что это кажется для вас смешным и муторным но все же я хочу разобраться с вашей помощью)

BIOS про романтика верно говоришь. Но осталось уже всего 3 дня, а я на работе разрываюсь. Времени не хватает)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
жуткий OffTopic:
Какая романтика?!
Это чуждый нам праздник, своей сутью полностью убивающий романтику.
Поздравил - попал, не поздравил - тоже попал. Где тут романтика???
Романтика - это цветы по будням без всякого повода. А позравление с праздником - это просто обязаловка.
А в реалиях нашей страны этот "праздник" вообще доведён до абсурда - поздравляют все всех! :shok:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
infant23
Пока это еще заготовка.
Сначала нужно запустить скрипт, подождать секунд 10, потом вручную открыть пустой рисунок в Paint, далее поместить курсор на этот рисунок, потом нажать кнопку "Pause" на клавиатуре, и скрипт начнет рисовать.
Картинка в bmp и полностью черно-белая(для начала можно в том же Paint нарисовать), небольшого размера, 300х300.
Рисует долго, поэтому есть выход по ESC.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
infant23,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Верх