![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Нужно активировать окно внешней программы и расположить его поверх всех других окон, при этом должно деактивироваться окно, которое было активно до этого.
Использовал Код:
SendMessage(WndP, WM_SETFOCUS,0,0); BringWindowToTop(WndP); Как эмулировать это? - выделить окно, но при этом чтобы всё другие остались деактивировались? Помогите, разобраться, пожалуйста. |
|
#2
|
|||
|
|||
|
Код:
SetForegroundWindow(Form1.Handle); SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE); |
| Этот пользователь сказал Спасибо Assistant за это полезное сообщение: | ||
T232006 (12.12.2022)
| ||
|
#3
|
|||
|
|||
|
Вобщем, получилось так -
Код:
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
|
|||
|
|||
|
попробуйте через sndkey32 (во вложении), юзать так:
Код:
sndkey32.AppActivate('Подключение к серверу');
sndkey32.SendKeys(PChar('{tab}{tab}{tab}' + ParamStr(1) + '{enter}'),True);
sndkey32.AppActivate('Trassir');
sndkey32.SendKeys('^m',false);P.S.: использовал очень давно, но работало так как мне нужно Последний раз редактировалось Assistant, 29.03.2011 в 21:58. |
|
#5
|
|||
|
|||
|
Цитата:
А каким образом подключить этот файл? Я положил файл в папку проекта и пробовал подключить этот файл в основном файле через Код:
{$inqlude sndkey32}В чём может быть ошибка? |
|
#6
|
||||
|
||||
|
Какбэ uses...
|
|
#7
|
|||
|
|||
|
Цитата:
Цитата:
Спасибище огромное за подсказки - всё работает супер. Намучался я с этой прогой. Но теперь всё, ок. |