Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.03.2011, 15:07
klmmn klmmn вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 11
Репутация: 10
По умолчанию Как активировать окно внешней программы?

Нужно активировать окно внешней программы и расположить его поверх всех других окон, при этом должно деактивироваться окно, которое было активно до этого.

Использовал
Код:
SendMessage(WndP, WM_SETFOCUS,0,0);
BringWindowToTop(WndP);
Окно внешней программы становится активным, но и окно, на котором был фокус до этого, тоже остаётся активным. Когда выделяешь окна с помошью мышки - такого не происходит - выделяется только последнее.

Как эмулировать это? - выделить окно, но при этом чтобы всё другие остались деактивировались? Помогите, разобраться, пожалуйста.
Ответить с цитированием
  #2  
Старый 28.03.2011, 15:26
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

Код:
SetForegroundWindow(Form1.Handle);
SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
Этот пользователь сказал Спасибо Assistant за это полезное сообщение:
T232006 (12.12.2022)
  #3  
Старый 29.03.2011, 21:49
klmmn klmmn вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 11
Репутация: 10
По умолчанию

Вобщем, получилось так -
Код:
 procedure TLinker.Timer1Timer(Sender: TObject);
  var
   Buf: array[0..5] of char;
   CommaPos, SpasePos: Integer;
   Index: Integer;
   Symbol: String;
   Layout: array[0.. KL_NAMELENGTH] of char;
  begin
   if workLink and workLine then                                     // если в глоб. перем. есть дескр. связываемых окон
    begin
     GetWindowText(WndS, Buf, 6);                                    // в Buf получаем первые 5 символов заголовка окна
     CommaPos:= Pos(',', Buf);                                       // пытаемся найти позицию запятой
     if CommaPos <> 0 then                                           // если найдено
      begin
       Symbol:= Copy(Buf, 1, CommaPos-1);                            // получаем Symbol без запятой
       SpasePos:= Pos(' ', Symbol);                                  // пытаемся найти позицию пробела
       if SpasePos <> 0 then Symbol:= Copy(Buf, 1, SpasePos-1);      // если найдено
      end
     else SpasePos:= 0;                                              // если не найдено запятой, то нет и пробела

     if (CommaPos = 0) and (SpasePos = 0) then Symbol:= Buf;         // если не найдена ни заятая, ни пробел
     if Symbol <> RSymbol then
      begin
       RSymbol:= Symbol;
       SetForegroundWindow(WndP);                                    // активизируем окно внешней программы
       LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE);  // английская раскладка клавиатуры
       for Index:= 1 to SizeOf(RSymbol) do
        begin
         Keybd_event(Ord(RSymbol[Index]),0,0,0);                     //нажать кл. Enter
         Keybd_event(Ord(RSymbol[Index]),0,KEYEVENTF_KEYUP,0);       //нажать кл. Enter
        end;
       Keybd_event(13,0,0,0);                                        //нажать кл. Enter
       Keybd_event(13,0,KEYEVENTF_KEYUP,0);                          //отпустить кл. Enter
      end;
    end;
  end;
end.

Но всёравно не всё работает. Ввод строки побуквенно в текстовое поле происходит нормально. Но почему-то не работает нажатие кнопки Enter - не активирует процесс поиска в окне внешней программы. Хотя если делать вручную - всё работает.

Может есть какие-то способ написать по другому строки процедуры выделенные зелёным? Возможно другой вариант подойдёт...
Ответить с цитированием
  #4  
Старый 29.03.2011, 21:55
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

попробуйте через sndkey32 (во вложении), юзать так:
Код:
sndkey32.AppActivate('Подключение к серверу');
sndkey32.SendKeys(PChar('{tab}{tab}{tab}' + ParamStr(1) + '{enter}'),True);
sndkey32.AppActivate('Trassir');
sndkey32.SendKeys('^m',false);
тут пример перехода в найденном окне: нажимает 3 раза TAB, вводит нужные данные из ParamStr(1) и нажимает Enter, потом переходит на окно с заголовком Trassir и нажимает Ctrl+M

P.S.: использовал очень давно, но работало так как мне нужно
Вложения
Тип файла: zip sndkey32.zip (4.1 Кбайт, 38 просмотров)
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя

Последний раз редактировалось Assistant, 29.03.2011 в 21:58.
Ответить с цитированием
  #5  
Старый 30.03.2011, 23:20
klmmn klmmn вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от Assistant
...

P.S.: использовал очень давно, но работало так как мне нужно

А каким образом подключить этот файл? Я положил файл в папку проекта и пробовал подключить этот файл в основном файле через
Код:
{$inqlude sndkey32}
... Выдаётся ошибка на строке "unit sndkey32;". Ошибка такая - "[Error] sndkey32.pas(97): Declaration expected but 'UNIT' found".

В чём может быть ошибка?
Ответить с цитированием
  #6  
Старый 30.03.2011, 23:28
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Какбэ uses...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 31.03.2011, 12:43
klmmn klmmn вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от Assistant
попробуйте через sndkey32 (во вложении), юзать так:

Цитата:
Сообщение от DJ PhoeniX
Какбэ uses...

Спасибище огромное за подсказки - всё работает супер. Намучался я с этой прогой. Но теперь всё, ок.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025