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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 22:18   #1
klmmn
 
Регистрация: 24.03.2011
Сообщений: 7
По умолчанию Активировать окно...

Пишу программку на Delphi 7, в Windows 7. Не могу разобраться как активизировать окно внешнего приложения программно - так сказать эмулировать эффект щелчка мышкой по этому окну. Помогите разобраться, пожалуйста.

Последний раз редактировалось klmmn; 24.03.2011 в 22:27.
klmmn вне форума Ответить с цитированием
Старый 24.03.2011, 22:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

MSDN SetFocus
p51x на форуме Ответить с цитированием
Старый 25.03.2011, 00:46   #3
klmmn
 
Регистрация: 24.03.2011
Сообщений: 7
По умолчанию

Вобщем, вот кусок кода, что бы было понятней. В стороке - SetFocus(WndP); - компилятор выдаёт ошибку, что я не правильно сделал? В момент выполнения процедуры TLinker.Timer1Timer(Sender: TObject); нужное окно не активировано... Вопрос остаётся открытым - как активировать окно внешней программы?

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

Код:
"Window.pas"

 // глобальные переменные
 var
  WndS: HWND;                                                   // дескриптор окна заголовок которого считывается
  WndP: HWND;                                                   // дескриптор окна в текстовое поле, в которого нужно вписать строку
  RSymbol: string;                                                // строка с которой сравниваем новое занчение заголовка
 //------------------------

 procedure TLinker.Timer1Timer(Sender: TObject);
  var
   Buf: array[0..5] of char;
   Index: Integer;
   Symbol: String;
  begin
   GetWindowText(WndS, Buf, 6);                                    // в Buf получаем первые 5 символов заголовка окна
   if Symbol <> RSymbol then
    begin
     RSymbol:= Symbol;
     SetFocus(WndP);                                           // 135-АЯ СТРОКА
     for Index:= 1 to SizeOf(RSymbol) do
      begin
       Keybd_event(Ord(RSymbol[Index]),0,0,0);                     // нажать кнопку клавиатуры
       Keybd_event(Ord(RSymbol[Index]),0,KEYEVENTF_KEYUP,0);       // отпустить кнопку клавиатуры
      end;
     Keybd_event(13,0,0,0);                                        // нажать кл. Enter
     Keybd_event(13,0,KEYEVENTF_KEYUP,0);                          // отпустить кл. Enter
    end;
  end;

Последний раз редактировалось klmmn; 25.03.2011 в 07:31.
klmmn вне форума Ответить с цитированием
Старый 25.03.2011, 07:10   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

какую ошибку?
p51x на форуме Ответить с цитированием
Старый 25.03.2011, 07:28   #5
klmmn
 
Регистрация: 24.03.2011
Сообщений: 7
По умолчанию

Вот эти ошибки -
Код:
[Error] Window.pas(135): Too many actual parameters
[Fatal Error] MyLinker.dpr(5): Could not compile used unit 'Window.pas'

Последний раз редактировалось klmmn; 25.03.2011 в 07:31.
klmmn вне форума Ответить с цитированием
Старый 25.03.2011, 12:06   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

судя по коду, вы хотите нажать клавишу в неком приложении в неком окне. Нажатие клавиши можно послать в определенное окно через SendMessage или PostMessage и без активации окна, приложения/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 25.03.2011, 15:56   #7
klmmn
 
Регистрация: 24.03.2011
Сообщений: 7
По умолчанию

Цитата:
судя по коду, вы хотите нажать клавишу в неком приложении в неком окне. Нажатие клавиши можно послать в определенное окно через SendMessage или PostMessage и без активации окна, приложения/
Да, именно так, я хочу программоно ввести некоторую строку в текстовое поле окна внешнего приложения.

Насчёт того, что можно без активации окна, не знаю. Поле окна внешней программы ведёт себя немного странно при работе вручную - это или глюк её или так было задумано. Опишу подробнее, чтобы было понятно...

Курсор автоматически помещается в поле ввода при активации внешнего окна (сдесь странностей нет). Далее...

В поле нужно вводить поисковый запрос только с клавиатуры и нажать кнопку Ентер (кнопки типа "Найти" - нет), после этого активизируется поисковый процесс - это единственный рабочий вариант. Если просто скопировать строку в поле и нажать Ентер - ничего не произойдёт.

Стереть сообщение в этом поле невозможно. Чтобы ввести новую строку вместо старой, нужно нажать кнопку Ентер или последовательно деактивировать и снова активировать окно с полем ввода - тогда при введении нового поискового запроса старый стирается и вводятся новые символы.

Всвязи с такими странностями этого внешнего поискового окна при работе с ним вручную - я хотел полностью эмулировать рабочий вариант ручного ввода с клавиатуры в программе.

Попробовал сделать всё же ввести с помощью SendMessage -
Цитата:
for Index:= 1 to SizeOf(RSymbol) do SendMessage(WndD, WM_SETHOTKEY, 0, Ord(RSymbol[Index])));
SendMessage(WndD, WM_SETHOTKEY, 0, 13);
- правда я не уверен, что я правильно использовал функцию и её параметры - не работает, хотя и ошибок компилятор не выдаёт... Помогите, пожалуйста.

Последний раз редактировалось klmmn; 25.03.2011 в 16:35.
klmmn вне форума Ответить с цитированием
Старый 26.03.2011, 19:23   #8
klmmn
 
Регистрация: 24.03.2011
Сообщений: 7
По умолчанию

Вобщем разобрался, как пользовать функцию SendMessage для ввода строки побуквенно:

Код:
for Index:= 1 to SizeOf(RSymbol) do
        SendMessage(WndD, WM_CHAR, Ord(RSymbol[Index]), 0); 
SendMessage(WndD, WM_CHAR, 13, 0);
Но как я и предполагал, нужно всё равно активировать окно (эмуляция клика мышкой по окно). Пробовал так - [CODE]
Вобщем разобрался, как пользовать функцию SendMessage:

Но как я и предполагал, нужно всё равно активировать окно (эмуляция клика мышкой по окно). Пробовал так -
Код:
SendMessage(WndP, WM_SETFOCUS,0,0);
- окно активируется, но... окно, которое до этого было активировано почему-то тоже остаётся активированным.

Как полностью сэмитировать эфект клика мышкой по заголовку окна - чтобы оставалось только одно активное окно нужное мне? Помогите разобраться, пожалуйста.
klmmn вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Активировать гиперссылки Verano naranjo Microsoft Office Excel 1 19.01.2011 12:11
Как активировать кнопку? Uzmaster Microsoft Office Access 5 01.01.2010 19:56
Как активировать в окне программы Mathcad окно Математика Tancha Софт 1 30.11.2008 13:02
Активировать всплывающую подсказку Илюха Общие вопросы Delphi 6 13.12.2007 16:35
Как активировать чужое приложение Hintman Win Api 3 30.04.2007 16:24