Вопрос № 41830: Уважаемые Эксперты!
Подскажите пожалуйста алгорит поиска пути (типа А стар. или волновой троссировки), который НЕ ИЩЕТ ПУТЬ ПО ДИАГОНАЛИ.
Заранее спасибо. ...Вопрос № 41868: Добрый день.
Есть вопрос. Хочу реализовать програмку, но не знаю как это сделать.
Вот в чем вопрос. Програма весит в памяти. Когда нажимается определенная сочетание клавиш то она запоминает выделенный текст.
Вопрос вот в чем. Как сделать ...Вопрос № 41878: Здравствуйте, эксперты!
Подскажите, п-та, как организовать запуск *.exe в приложении....Вопрос № 41894: Нужно создать прогу на подобие планировщика задач. Думаю сделать ее сервисом который в определеном времени делал какието задачи, но не слишком ето загрузит систему? Подскажите метод....Вопрос № 41910: Здраствуйте уважаемые эксперты
Мне нужно написать програмку которая запустила бы другую програмку (md5inside) сэмулировать нажатие F5 клавиши в этой программе и через 5 минут програмно закруть эту программу (какбы нажать крестик в верхнем углу.)<...
Вопрос № 41.830
Уважаемые Эксперты!
Подскажите пожалуйста алгорит поиска пути (типа А стар. или волновой троссировки), который НЕ ИЩЕТ ПУТЬ ПО ДИАГОНАЛИ.
Отвечает: Решетник Д
Здравствуйте, Golden Spider!
Когда-то делал лабу по программированию - алгоритм Дейкстры (Дэйкстра).
Но кода не осталось.
Также, может, поиск в ширину и в длину
--------- Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 19:11 Оценка за ответ: 5 Комментарий оценки: Вроде бы слышал что то по Дейктры... Нужно проверить...
Вопрос № 41.868
Добрый день.
Есть вопрос. Хочу реализовать програмку, но не знаю как это сделать.
Вот в чем вопрос. Програма весит в памяти. Когда нажимается определенная сочетание клавиш то она запоминает выделенный текст.
Вопрос вот в чем. Как сделать чтобы программа реагирыола на определенное сочетание клавиш.
Вопрос второй, как узнать выделеный текст, не важно в каком редакторе находишся.
Если есть примеры былобы не плохо. Жду различных предложений.
Всем заранее спасибо.
Работаю на делфи.
Отправлен: 02.05.2006, 13:56
Вопрос задал: AllexZ (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Coupler
Здравствуйте, AllexZ!
Чтобы прога реагировала на нужное сочетание клавиш, нужно зарегистрировать системную горячую клавишу:
Создание системных горячих клавиш (ctrl+alt+F12):
RegisterHotkey(Handle, 1, mod_alt or mod_control, vk_f12);
Их обработка:
procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
if msg.hotkey = 1 then
begin
{ваши действия}
BringToFront;
end;
end;
Не забудьте поместить procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY; в секцию private.
В задаче копирования выд.текста предлагаю идти по пути наименьшего сопротивления: узнать хендл активного окна и послать ему ctrl+с. Так поступает известная прога Punto Switcher. Если же вас это не устраивает, почитайте статьи на delphiworld (www.delphiworld.narod.ru), там много чего есть. Все вопросы - в мини-форум или на внутреннюю почту.
Ответ отправил: Coupler (статус: 9-ый класс)
Ответ отправлен: 02.05.2006, 15:17 Оценка за ответ: 5 Комментарий оценки: Большое спасибо. Тогда вопрос еще как послать сообщение "ctrl+с". И еще вопрос, как определить хендел активного окна. Как считать даные из буфера?
Отвечает: Решетник Д
Здравствуйте, AllexZ!
Вариант 1.
(Самый легкий).
Использовать registerhotkey для отловки нажатия клавиш. а при нажатии на комбинацию посылать в активное окно комбинацию Ctrl+C / Ctrl+Insert.
sendmessage(GetActiveWindow, WM_KEYDOWN, VK_CONTROl, 0);
sendmessage(GetActiveWindow, WM_KEYDOWN, ord('c'), 0);
sendmessage(GetActiveWindow, WM_KEYUP, VK_CONTROl, 0);
sendmessage(GetActiveWindow, WM_KEYUP, ord('c'), 0);
(если честно, то, вроде, он не работает)
Вариант 2.
Поставить системную глобальную ловушку (смотреть SetWindowsHook и WH_KEYBOARD). Так как все текстовые окна - наследники Edit'a, то можно перебирать ВСЕ компоненты (дочерние - FindWindowEx) типа поле редактирования, и посылаю каждому сообщение WM_COPY, поочередно обрабатывать буфер обмена.
--------------------------
если что - пишите на внутренне мыло
--------- Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 18:57 Оценка за ответ: 4 Комментарий оценки: Проверем на работу первого варианта. А как можно работать с буфером?
Вопрос № 41.878
Здравствуйте, эксперты!
Подскажите, п-та, как организовать запуск *.exe в приложении.
Отправлен: 02.05.2006, 15:35
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Jeka911
Здравствуйте, Ramil!
Смотрите в хелпе ф-ю ShellExecute(..;
--------- Шахтер - чемпион!!!
Ответ отправил: Jeka911 (статус: 2-ой класс)
Ответ отправлен: 02.05.2006, 16:33
Отвечает: Denisss
Здравствуйте, Ramil!
Мне известно три метода: 1. Через ShellExec (см. предыдущий ответ) 2. WinExec - функция прописана в модуле Windows.pas
Пример: var
Exe: string;
begin
// Путь к файлу (может быть как полный, так и относительный
Exe:= 'explorer.exe';
// Запуск программы из файла
// Функция имеет два параметра:
// 1. Путь к программе (в том числе и с параметрами запуска)
// 2. Способ вывода окна (см. предыдущий ответ)
WinExec(PChar(Exe), SW_SHOWNORMAL); end;
3. Через CreateProcess - использование функции более сложное. Полностью всех ее параметров описывать не буду, просто приведу простейший пример с некоторыми комментариями (за подробностями рекомендую лезть в MSDN и там искать).
Пример: var
lpStartUpNfo: TStartupInfo;
lpProcessInformation: TProcessInformation;
Exe, Path: string;
begin
// Опустошаем lpStartUpNfo
ZeroMemory(@lpStartUpNfo, sizeof(lpStartUpNfo));
// Путь к программе
Exe:= 'explorer.exe';
// Рабочая папка программы
Path:= 'c:windows';
// заполняем lpStartUpInfo with lpStartUpNfo do
begin
cb:= sizeof(lpStartUpNfo);
// STARTF_USESHOWWINDOW - означает, что мы заполнили
// свойство wShowWindow и его надо проверить
dwFlags:= STARTF_USESHOWWINDOW;
// См. предыдущий ответ
wShowWindow:= SW_SHOWNORMAL; end;
// Если не удалось выполнить программу if not CreateProcess(nil, PChar(Exe), nil, nil, false, CREATE_NEW_CONSOLE or
// Приоритет запуска - нормальный
NORMAL_PRIORITY_CLASS, nil, PChar(Path), lpStartUpNfo, lpProcessInformation) then
// Если что, то выдаем код ошибки
MessageBox(Handle, PChar('Произошла ошибка с кодом: ' +
IntToStr(GetLastError)), nil, 0) else
// Закрываем хэндл
CloseHandle(lpProcessInformation.hProcess); end;
Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 02.05.2006, 16:47 Оценка за ответ: 5
Вопрос № 41.894
Нужно создать прогу на подобие планировщика задач. Думаю сделать ее сервисом который в определеном времени делал какието задачи, но не слишком ето загрузит систему? Подскажите метод.
Я думаю не слишком загрузит, если выполнять задачи по таймеру.
Т.е. находить задачи для выполнения, например раз в минуту.
--------- Шахтер - чемпион!!!
Ответ отправил: Jeka911 (статус: 2-ой класс)
Ответ отправлен: 02.05.2006, 19:14
Отвечает: Решетник Д
Здравствуйте, Negruzzi Cristian!
Если на компе стоит ХР, то точно не загрузит.
Для определения времени просто нужно (один из вариантов):
1 создать список задания.
2 отсортировать их убыванию
3 поставить таймер на самый ранний
Так при удалении (выполнении) задания, нужно будет устанавливать таймер на след элемент.
Проблемы:
Пользователь переставил время. Это отслеживается при помощи WM_TIMECHANGE (при этом нужно только переинициализировать таймер).
установка таймера:
SetTimer(handle, ID, time, nil)
ID - номер таймера
time - количество миллисекунд для отсчета.
событие таймера:
..
public
...
procedure wmtimer(var msg: TMessage); message WM_TIMER;
..
procedure TForm1.wmtimer(var msg: TMessage);
begin
if msg.wParam = ID then
begin
<сделать что-то>
killtimer(handle, ID);
InitNextTimer;
end;
end;
--------- Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 4-ый класс)
Ответ отправлен: 02.05.2006, 20:13
Отвечает: Kazakh
Здравствуйте, Negruzzi Cristian!
Как вариант, если заданий не очень много
Я думаю должна некая структура типа
"Список_задач
Время_запуска Активно Наименование Действие Примечание ... ... "
Заполняется .... Потом сортируется по Времени_запуска.
1. И у обычного TTimer задается интервал Время_запуска-тек_время.
2. Потом ОнТаймер выполняем Действие
3. Помечаем как Активно:=False
4. Берем следуещее самое ранне задание и пункт 1.
если нет активных то выход.
--------- Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 7-ой класс)
Ответ отправлен: 03.05.2006, 08:18 Оценка за ответ: 4
Вопрос № 41.910
Здраствуйте уважаемые эксперты
Мне нужно написать програмку которая запустила бы другую програмку (md5inside) сэмулировать нажатие F5 клавиши в этой программе и через 5 минут програмно закруть эту программу (какбы нажать крестик в верхнем углу.)
Я никак немогу сэмулировать нажатие F5 и програмно закрыть приложение, помогите мне пожалуйста.
Заранее спасибо.
Отправлен: 02.05.2006, 21:29
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Лучников Ю.В.
Здравствуйте, Станислав!
В прикрепленном к ответу архиве находится пример проекта, который запускает стандартный калькулятор, нажимает в нем F5 и через 10 секунд его закрывает...
Переделать пример под ваши нужды проблем думаю не составит;)
Успехов!
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
Ответ отправил: Лучников Ю.В. (статус: *Мастер-Эксперт) Россия, Киров WWW:нЧат - Наш Чат! ICQ: 176308580 ---- Ответ отправлен: 03.05.2006, 23:49