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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 12:26   #21
Der_G()RuNu(h
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 37
По умолчанию

Цитата:
Сообщение от xwicked Посмотреть сообщение
Код:
...
procedure presskey(key:word);
begin
 keybd_event(key,0,0,0);
end;
procedure releasekey(key:word);
begin
 keybd_event(key,0,KEYEVENTF_KEYUP,0);
end;
procedure clickkey(key:word);
begin
 keybd_event(key,0,0,0);
 keybd_event(key,0,KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 clickkey(VK_RETURN);
end;

procedure sword(s:string);
var i:integer;
begin
 for i:=1 to length(s) do
  begin
   if i= 1 then
    begin
     Sleep(500);
     presskey(VK_SHIFT);
    end
    else
    releasekey(VK_SHIFT);
   Sleep(500);
   clickkey(ord(s[i]));
  end;
end;

procedure down(i:integer);
begin
 for i:=1 to i do
  begin
   Sleep(500);
   clickkey(VK_DOWN);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Sleep(500);
 ShellExecute(handle,nil,'winword.exe',nil,nil,SW_RESTORE);
 Sleep(500);
 sword('DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC');
 Sleep(500);
 clickkey(VK_RETURN);
 Sleep(500);
 presskey(VK_MENU);
 Sleep(500);
 clickkey(VK_SHIFT);
 Sleep(500);
 releasekey(VK_MENU);
 sword('IF SAVE THEN BORODA');
 presskey(VK_MENU);
 Sleep(500);
 clickkey(VK_F4);
 Sleep(500);...
Если нужно - прикреплю все примеры архивом.
я что-то никак не разберусь, а где для цифр и букв?
Der_G()RuNu(h вне форума Ответить с цитированием
Старый 24.06.2011, 12:39   #22
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)с символами надо раскладку учитывать
2)можете попробовать VkKeyScan если хотите.
(кстати не так давно, у человека все отлично работало)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2011, 13:17   #23
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Der_G()RuNu(h Посмотреть сообщение
я что-то никак не разберусь, а где для цифр и букв?
Код:
...
procedure presskey(key:word);//Нажатие клавиши
begin
 keybd_event(key,0,0,0);
end;
procedure releasekey(key:word);//Возврат клавиши
begin
 keybd_event(key,0,KEYEVENTF_KEYUP,0);
end;
procedure clickkey(key:word);//Щелчок по клавише
begin
 keybd_event(key,0,0,0);
 keybd_event(key,0,KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 clickkey(VK_RETURN);//Щелчок по кнопке "Enter"
end;

//Нажатие по клавишам, содержащимся в переменной sword 
procedure sword(s:string);
var i:integer;
begin
 for i:=1 to length(s) do
  begin
//Первая буква - заглавная
   if i= 1 then
    begin
     Sleep(500);
     presskey(VK_SHIFT);
    end
    else
    releasekey(VK_SHIFT);
   Sleep(500);
   clickkey(ord(s[i]));
  end;
end;

//Прогон курсора(если в блокноте) на i раз вниз
procedure down(i:integer);
begin
 for i:=1 to i do
  begin
   Sleep(500);
   clickkey(VK_DOWN);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Sleep(500);
//Запуск программы MSWORD
 ShellExecute(handle,nil,'winword.exe',nil,nil,SW_RESTORE);
 Sleep(500);
//Набирается текст в Word'е "Вирус вирус вирус вирус ..." 
//Начальная раскладка предполагается русская.
 sword('DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC');
 Sleep(500);
 clickkey(VK_RETURN);
 Sleep(500);
//Смена раскладки клавиатуры на английскую
----
 presskey(VK_MENU);//Alt нажать
 Sleep(500);
 clickkey(VK_SHIFT);// Shift щелчок
 Sleep(500);
 releasekey(VK_MENU);//Alt возврат
----
 sword('IF SAVE THEN BORODA');//Набор текста уже на английском
//Закрытие Word'а
 presskey(VK_MENU);//Alt
 Sleep(500);
 clickkey(VK_F4);//+ F4
 Sleep(500);...
По функции ord. Если с цифрами будет непонятно - поясню.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 24.06.2011 в 14:03.
xwicked вне форума Ответить с цитированием
Старый 01.07.2011, 15:16   #24
Der_G()RuNu(h
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 37
По умолчанию

этот способ эмуляции работает только сам с собой, как только я его вставляю в свою прогу клиент-сервер, так никакого результата...
Der_G()RuNu(h вне форума Ответить с цитированием
Старый 02.07.2011, 15:05   #25
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Der_G()RuNu(h Посмотреть сообщение
этот способ эмуляции работает только сам с собой, как только я его вставляю в свою прогу клиент-сервер, так никакого результата...
Правильно. Так и должно быть - это шаблон кода, работающего на сервере. Если есть ещё вопросы - задавайте!
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 02.07.2011, 17:53   #26
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Попробуй этот код без эмуляции клавиш, а с помощью сообщений форме.
У меня этот код добавил запись в документ WinWord.
Добавляет запись даже когда окно WinWord не в фокусе.

Дальше можете до работать этот код под себя.

Цитата:
var
WinList: TStringList;

//Получение списка дочерних окон главного окна
Procedure ListWnd(Handle: hwnd; List: TStrings);
function EnumWnd(H: hwnd; l: LPARAM): boolean; stdcall;
var
ClassName : string; //Класс окна
WindowName : string; //Заголовок окна
i:integer;
begin
Result := True;
SetLength(ClassName, $FFFF);
SetLength(ClassName, GetClassName(H, PChar(ClassName), $FFFF));
SetLength(WindowName, $FFFF);
SetLength(WindowName, GetWindowText(H, pchar(WindowName), $FFFF));
i:=WinList.Count+1;
WinList.Add(Format('%d,ClassName=%s ,WindowName=%s,Handle=%d',
[i, ClassName, WindowName, H]));
end;
var
i:integer;
begin
if Handle<>0 then begin
WinList:=TStringList.Create;
EnumChildWindows(Handle, @EnumWnd, 1);
List.Assign(WinList);
WinList.Free;
end;
end;

//Поиск нужного хэндла в главном окне дочерних окон
Function FindWndChild(h: HWND; s: string): HWND;
var
WinList:TStringList;
i:integer;
begin
result:=0;
WinList:=TStringList.Create;
ListWnd(h, WinList);
for i:=0 to WinList.Count-1 do
if pos(ansiLowerCase(s),ansiLowerCase( WinList[i]))<>0 then begin
Result:=strtoint(copy(WinList[i], pos('Handle=',WinList[i])+7, maxint));
end;
WinList.Free;
end;

procedure sword(h: HWND; s:string);
var i:integer;
begin
for i:=1 to length(s) do
begin
PostMessage(H, WM_KEYDOWN, ord(s[i]), 0);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
hcl: HWND;
s: string;
begin
//Ищем главное окно Winword
h:=FindWindow('OpusApp', nil);
//Если не нашли то загружаем winword
if h=0 then begin
ShellExecute(handle, nil,'winword.exe', nil, nil, SW_RESTORE);
//ждем когда появится главное окно
while h=0 do begin
application.ProcessMessages;
h:=FindWindow('OpusApp', nil);
end;
end;
//Поиск окна документа главной формы в списке дочерних окон
hcl:=FindWndChild(h,'ClassName=_WwG ');
//ждем когда появятся дочерние окна главного окна
while hcl=0 do begin
application.ProcessMessages;
ListWnd(h, ListBox1.Items);
hcl:=FindWndChild(h,'ClassName=_WwG ');
end;
//Записываем в документ данные
if hcl<>0 then
sword(hcl,'DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC DBHEC');
end;

Последний раз редактировалось Aliens_wolfs; 02.07.2011 в 18:22.
Aliens_wolfs вне форума Ответить с цитированием
Старый 02.07.2011, 20:35   #27
Der_G()RuNu(h
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Попробуй этот код без эмуляции клавиш, а с помощью сообщений форме.
У меня этот код добавил запись в документ WinWord.
Добавляет запись даже когда окно WinWord не в фокусе.

Дальше можете до работать этот код под себя.
мне нужна именно эмуляция, причем чтобы работала по сети. само с собой и раньше работало...
Der_G()RuNu(h вне форума Ответить с цитированием
Старый 02.07.2011, 20:57   #28
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Der_G()RuNu(h Посмотреть сообщение
мне нужна именно эмуляция, причем чтобы работала по сети. само с собой и раньше работало...
Эмуляция нужна только для сервера, как я понял. Вам сейчас нужно узнать как считать у клиента нажимаемые клавиши и привести всё это в систему???
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 02.07.2011, 21:01   #29
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По каждой нажатой клавише посылайте серверу сообщение, он обрабатыват и изображает. А как вы по сети себе это по другому представляете?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.07.2011, 21:33   #30
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Принцип работы вашей программы как я понял должен быть таков.
У себя должны отправлять сообщение клиенту типа нажать клавишу, а у клиента сервер принимая вашу команду проэмулировать нажатие этой клавиши и прислать вам ответ мол все прошло успешно. Тогда да согласен нужна эмуляция клавиш можно и курсора у клиента.

Последний раз редактировалось Aliens_wolfs; 02.07.2011 в 21:48.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие кнопок мыши в чужом приложении Der_G()RuNu(h Работа с сетью в Delphi 16 25.05.2011 13:09
как узнать произошло ли нажатие на кнопку в чужом окне(приложении) Dim969 Общие вопросы C/C++ 1 18.12.2010 15:05
Долгое нажатие клавиши в KeyDown как одно нажатие marina15056 Общие вопросы Delphi 7 16.08.2009 00:22
Окно в чужом приложении? Volkogriz Общие вопросы Delphi 3 10.02.2009 18:22
Не срабатывает программное нажатие кнопки в чужом окне alxsev Общие вопросы Delphi 3 29.01.2009 20:32