Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Мастера, помогите решить такую проблемму.   Найти похожие ветки 

 
Style ©   (2004-04-07 10:10) [0]

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

В общем в той программе которая не моя, комонентами(контролами) оконами (TWinControl) - является только кнопка. Остальные контролы все рисованные, но якобы имеют свой фокус. Т.е. они не имеют HWND и я не могу работать с ними стандартными функциями.

Поэтому установив  фокус сначала на стандартный компонент - Кнопку, для дальнейшей эмуляции работы приходится использовать
keybd_event(VK_TAB... для перемещения фокуса по рисованным контролам.

procedure PressKey(vk: integer; count: integer);
var i: integer;
begin
  for i := 1 to Count do
  begin
   keybd_event(vk,0,0,0);  Sleep(5);
   keybd_event(vk,0,KEYEVENTF_KEYUP,0);
  end;
end;

procedure PressStr(Str: string);
var
 i: integer;
begin
 for i := 1 to Length(str) do
 begin
    PressKey(VkKeyScan(Str[i]),1);
 end;
end;

Но в процессе работы программы открываются другие окна загрузку которых нужно было дождаться я сделал это так:

procedure WaitForWindow(WinName: string);
var  p: pchar;
begin
 while true do
 begin
   Sleep(100);
   P := pchar(Allocmem(255));
   try
     GetWindowText(GetForegroundWindow,p,255);
    if(Trim(p) = WinName) then break;
   finally
     FreeMem(p);
   end;
end;
end;

Чтобы определить закрытие окна я ожидаю главную форму программы.
Но вот беда..
Сразу после закрытия модального окна чужая программа начинает выполнять какойто запрос, ну обращается к БД.
В общем если я пытаюсь после ожидания главной формы нажимать какие-нить клавиши в программе, то естественно эти действия (например перемещения фокуса) не выполняются т.к. программа занята на этот момент..
Вот как мне дождаться пока процесс не освободится не используя sleep? Причем  программа не подает никаких внешних признаков, не создает окно ожидания и т.д. Едиственно что  - она пишет в StatusBar - "Подождите минутку" - но  зная HWND строки состояния я не могу прочитать текст, т.к. это не WindowText..


 
Style ©   (2004-04-07 11:14) [1]

И еще вопрос?

Можно сменить язык ввода другого процесса
ActivateKeyboardLayout(LoadKeyboardLayout("00000419",0),0);

меняет в текущей нити :(


 
Дремучий ©   (2004-04-07 13:55) [2]


> но  зная HWND строки состояния я не могу прочитать текст,
> т.к. это не WindowText..

а какой же там текст?


 
Style ©   (2004-04-07 14:13) [3]

Дремучий ©  
это рисунок...  GetWindowText ничего не возвратит..


 
Дремучий ©   (2004-04-07 15:22) [4]


> это рисунок...

а GetPixel? ;))


 
Style ©   (2004-04-07 15:24) [5]

Я пока так и сделал :))


 
SPeller ©   (2004-04-07 15:45) [6]

Кстати, для отсылки кликов можно использовать обычные сообщения совместно с функцией WindowFromPoint.


 
savva ©   (2004-04-07 15:56) [7]

> Style ©   (07.04.04 11:14) [1]
> И еще вопрос?
>
> Можно сменить язык ввода другого процесса
> ActivateKeyboardLayout(LoadKeyboardLayout("00000419",0),0);
>
> меняет в текущей нити :(

попробуй http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10256


 
Style ©   (2004-04-07 16:02) [8]


> Кстати, для отсылки кликов можно использовать обычные сообщения
> совместно с функцией WindowFromPoint.


Я на кнопки нажимаю при помощи посылки сообщения.

function GetBlankControl(TB: Hwnd; ControlName: string): HWND;
var
Ctrl: HWND;
begin
 Ctrl := FindWindowEx(TB,0,"MDIClient",nil);
 Ctrl := FindWindowEx(Ctrl,0,"TBlankWindow",nil);
 Ctrl := FindWindowEx(Ctrl,0,"T_BlankEditor",nil);
 Ctrl := FindWindowEx(Ctrl,0,"TTplInterior",nil);
 Ctrl := FindWindowEx(Ctrl,GetTopWindow(Ctrl),nil,pchar(ControlName));
 result := Ctrl;
end;

Ctrl := GetBlankControl(TB, "Бухгалтерский учет...");

SendMessage(Ctrl,WM_SETFOCUS,0,0);
SendMessage(Ctrl,WM_KEYDOWN,VK_SPACE,0);
SendMessage(Ctrl,WM_KEYUP,VK_SPACE,0);


 
Style ©   (2004-04-07 16:03) [9]


>
> попробуй http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10256

ссылка битая :(


 
savva ©   (2004-04-07 16:17) [10]


> Style ©   (07.04.04 16:03) [9]
>
> >
> > попробуй http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10256
>
> ссылка битая :(

вот то же самое
http://www.codenet.ru/progr/delphi/stat/internat.php



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
3-1081325944
CASPER
2004-04-07 12:19
2004.05.02
Как скопировать данные из одной базы Access в другую.


6-1078530063
teapot
2004-03-06 02:41
2004.05.02
как перенаправлять сетевой трафик на Делфи?


3-1080823713
badis
2004-04-01 16:48
2004.05.02
Будет ли работать БД?


6-1078992878
knack
2004-03-11 11:14
2004.05.02
Установка и изменение настроек протокола TCP/IP.


1-1082306540
Just_
2004-04-18 20:42
2004.05.02
Поиск и замена по правилу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский