Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2012, 20:06   #1
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию Ошибка в куске кода, немогу понять где

Суть: На форме есть некоторый эдит 1, запускается программа2, необходимо сделать запушенное окно активным и сэмулировать в нем нажате некоторой полследовательности клавиш

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar(memo1.Lines[3]), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,1,1);
sendmessage(findwindow('TFORM1','Launch EMCO Control'),wm_activate,1,1) ;
// Имитация нажатия клавиш для входа в Управляющую систему
keybd_event(VK_DOWN, 0, 0, 0);
Keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
Keybd_event(VK_INSERT, 0, 0, 0);
Keybd_event(VK_INSERT, 0,KEYEVENTF_KEYUP, 0);

 end;
Запущенное окно не хочет становится активным
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет
xaero93 вне форума Ответить с цитированием
Старый 26.10.2012, 20:36   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Да нет, становится, просто в конце процедуры Timer1Timer нужно таймер-то тормозить, а то начинает мигать между формой и окном.

UPD. Хотя нет, я ступил и ошибся (хотя и не совсем - окна продолжают перемигиваться, а это явно не в Ваших планах)

Код:
sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,1,1);
sendmessage(findwindow('TFORM1','Launch EMCO Control'),wm_activate,1,1) ;
Ошибка, скорее всего, в том, что у Вас одинаковый класс в обоих findwindow прописан (TForm1) - вот он и делает активным окно класса ТФорм1, то есть Вашу исходную форму.

Я прогнал Вашу программу на своем тесте, открыл екселевский файлик - все работает прекрасно

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar('e:\cal.xls'), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
sendmessage(findwindow('Excel','Excel'),WM_ACTIVATE,1,1);
//sendmessage(findwindow('TFORM1','Launch EMCO Control'),wm_activate,1,1) ;
// Имитация нажатия клавиш для входа в Управляющую систему
keybd_event(VK_DOWN, 0, 0, 0);
Keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
Keybd_event(VK_INSERT, 0, 0, 0);
Keybd_event(VK_INSERT, 0,KEYEVENTF_KEYUP, 0);
Timer1.Enabled:=false;
end;
Если Вы запускаете какую-то свою внешнюю форму, попробуйте указать класс TForm вместо TForm1.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 26.10.2012 в 20:43.
Sciv вне форума Ответить с цитированием
Старый 26.10.2012, 20:41   #3
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию

Ой я бестолочь. Спасибо за подсказку

добавил отключение таймера, но почему то окно с программой 1 не помещается на задний план, а окно с программой 2 не становится активным и не помещается на передний
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет

Последний раз редактировалось xaero93; 26.10.2012 в 20:50.
xaero93 вне форума Ответить с цитированием
Старый 26.10.2012, 20:44   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Ой я бестолочь
Ну не знаю... в 15 лет такое написать... Вы слишком самокритичны
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 26.10.2012, 21:22   #5
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию

Агаааа, понял сту ошибки. Она заныкалась вот здесь
sendmessage(findwindow('TFORM1','Fo rm1'),WM_ACTIVATE,1,1);
sendmessage(findwindow('TFORM1','Launch EMCO Control'),wm_activate,1,1) ; Это стороння программа, как определить, что должно быть там написано вместо TFORM1 ?
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет
xaero93 вне форума Ответить с цитированием
Старый 26.10.2012, 22:45   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну я Вам об этом выше и писал

А насчет классов (по-английски, правда) можно заглянуть по ссылкам:

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

http://msdn.microsoft.com/en-us/libr...x#class_styles

Думаю, Вам нужен класс #32769

UPD. Или просто имя запускаемого файла внешней программы попробовать...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 26.10.2012 в 22:52.
Sciv вне форума Ответить с цитированием
Старый 26.10.2012, 22:52   #7
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию

Если код выглядит таким образом( все програмные нажатия на клавиатуру закомментированны), то окна меняются. Второе стнаовится активным.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var h:hwnd;p:pchar;mk:Cardinal;
begin
 memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar(memo1.Lines[3]), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,0,0);
sendmessage(findwindow(nil,'EMCO'),wm_activate,1,0) ;
timer1.Enabled:=false;
// Имитация нажатия клавиш для входа в Управляющую систему
//keybd_event(VK_DOWN, 0, 0, 0);
//Keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
//Keybd_event(VK_INSERT, 0, 0, 0);
//Keybd_event(VK_INSERT, 0,KEYEVENTF_KEYUP, 0);
Суть же проблемы в том, что как только я убираю \\ у кода для эмуляции нажатия клавиш, эти самые нажатия происходят на Форме1, а мне нужно,чтобы они происходили в запушенной с формы1 программе. Пока ищу способ для решения данной проблемы.
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет
xaero93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не понять где ошибка xakkkkker Паскаль, Turbo Pascal, PascalABC.NET 1 16.05.2011 09:42
Найти ошибку в маленьком куске кода xaero93 Помощь студентам 4 27.01.2011 14:35
не могу понять где ошибка Neon-z PHP 13 22.01.2011 16:15
Помогите понять где ошибка !!! beliy13 Помощь студентам 2 12.12.2009 20:22
Помогите пожалуйста разобраться в куске кода ourlifeforus Общие вопросы C/C++ 1 02.06.2009 19:37