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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.02.2012, 19:38
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
Вопрос Хендл окна

Здравствуйте.Проблема в следующем:

нужно получить хенд кнопки "Отправить" в Skype.Все хендлы окон я получил включая сам edit(поле ввода сообщения),скорее всего эта кнопка как то с ним склеена/совмещена(где вычитывал такое,возможно неправильно понял и ошибаюсь).
По этой кнопке нужно щёлкнуть левой кнопкой мыши(vk_return не нужен,именно кнопка мыши).Положение окна может меняться,по этому координаты вычислять тоже неэффективно.Ребят помогите пожалуйста кодом,чтобы щелкнуть по этой кнопке левой кнопкой мыши.

приложу скрин))

Ответить с цитированием
  #2  
Старый 13.02.2012, 20:16
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

У неё может и не быть хэндла. Эта кнопка может быть простой картинкой, а форма - отслеживать нажатие, когда координаты мыши принадлежат картинке.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 13.02.2012, 20:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Можно получить координаты окна, высчитать положение кнопки и по нужным координатам клямкнуть мышкой. Как говорилось выше, у этой кнопки хэндла может и не быть...
Ответить с цитированием
  #4  
Старый 13.02.2012, 20:35
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

хм,можете привести пример?))
если я правильно понимаю,окно может тоже в размерах меняться и кнопка передвигаться соответственно,разве что она высчитывает когда курсор находится на этой картинке анимирует её и при "клаце" выполняет отправку.

ок.Дайте код,который бы высчитывал координаты этой голубенькой кнопочки ну а дальше я думаю по переменным расфосую и отдам переменные координатам мыши.
p.s. я не представляю как может выглядеть такое.
Ответить с цитированием
  #5  
Старый 13.02.2012, 21:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
var
  pr : TPoint;
  aRect : TRect;
begin
  GetGursorPos(pt); // узнать позицию мышки
  ScreenToClient(Wnd, pt); // перевести координаты 'десктопа' в оконные Skype-а
  if PtInRect(aRect, pt) then // в aRect уже должны "лежать" предпологаемые координаты кнопки
  begin
    // что-то делаем
  end;
end;
это только общее направление для размышления
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 13.02.2012, 21:35
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

хорошо,завтра попробую.
хотя я всё еще думаю: форму ведь можно растянуть,а вместе с ней и координаты кнопки изменяться.так нужно придумать что бы каждый раз не вбивать новые координаты кнопки(+еще высчитывать).программа будет стоять не только у меня на компьютере,так что надо как то автоматизировать поиск это кнопки(ну или определение её координатов)
Ответить с цитированием
  #7  
Старый 14.02.2012, 00:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно найти в памяти программы место, где лежат переменные координат кнопки, и читать оттуда. Только вот скорее всего там было что-то динамическое, и адрес найти будет проблематично.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 14.02.2012, 00:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Кнопка всегда остается в одном положении относительно двух сторон окна (обычно, извращенный дизайн не рассматриваем). Соответсвенно, получив координаты окна (точнее его Rect), всегда можно посчитать где эта кнопка находится в экранных координатах.
Ответить с цитированием
  #9  
Старый 14.02.2012, 05:44
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

я писал такой неэффективный брутфорс - делает скриншот и ищет кнопку по нему, если такой нужен, могу поискать его
Ответить с цитированием
  #10  
Старый 14.02.2012, 14:59
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Pyro,я так понимаю он по цветам будет искать?) скинь,посмотрю.
lmikle,покажи как пожалуйста.(незнаю,но отношусь скептически.)
Bargest, вот это было бы хорошим вариантом.узнать из памяти координаты кнопки на форме и передать их маусу и клацнуть. думаю это более стабильный метод.
Ответить с цитированием
  #11  
Старый 14.02.2012, 16:59
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

особенность: при поиске использует только первую полоску, т.е. what должна но не обязана быть высотой в 1px
Цитата:
function Find(what, where: tBitmap; center: boolean = true): tPoint; overload;
CONST
PixelCountMax = 32768;
TYPE
pRGBArray = ^TRGBArray;
TRGBArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple;
var
ax, ay, x, y, wa, ha, wx, wy: Integer;
xfrom, yfrom: Integer; // c: TControl;
o, p: pRGBArray;

function cc(o, p: TRGBTriple): boolean;
begin
if (o.rgbtBlue <> p.rgbtBlue) or (o.rgbtGreen <> p.rgbtGreen) or (o.rgbtRed <> p.rgbtRed) then
result := false
else
result := true;
end;

label
vso, next;
begin wa := what.Width; ha := what.Height;
{dx := 0; dy := 0;} ay := 0; ax := 0; wx := where.Width;
xfrom := -1; yfrom := -1; wy := where.Height;
o := what.ScanLine[ay];

for y := 0 to wy - 1 do
begin
p := where.ScanLine[y];
for x := 0 to wx-wa - 1 do
if cc(p[x], o[ax]) then
begin
while (ax < wa-1) and (x+ax < wx - 1) do
begin
if not cc(p[x+ax], o[ax]) then
begin
ax := 0;
goto next;
end;
inc(ax);
end;
xfrom := x;
yfrom := y;
goto vso;
next:
end;
end;
result := point(-1, -1);
exit;

vso:
if not center then
result := point(xfrom, yfrom)
else
result := point(xfrom +wa div 2, yfrom +ha div 2);
// result := point(xfrom+ wx div 2, yfrom + wy div 2);
end;
ps магически, но работает
Ответить с цитированием
  #12  
Старый 14.02.2012, 17:34
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Pyro,за гранью моего понимания.
Приведу пример как делал я:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  h1,h2,h3,h4,h5,h6:HWND;
begin
  h1:=FindWindow('tSkMainForm',nil);
  h2:=FindWindowEx(h1,0,'TConversationsControl',nil);
  h3:=FindWindowEx(h2,0,'TAccessibleEdit',nil);
  SendMessage(h3, WM_Settext, 0,integer(pchar('echo123')));
  SendMessage(h3, WM_KEYDOWN,VK_RETURN ,0 );
  SendMessage(h3, WM_KEYUP, VK_RETURN, 0);
  h4:=FindWindow('TConversationForm',nil);
  h5:=FindWindowEx(h4,0,'TChatEntryControl',nil);
  h6:=FindWindowEx(h5,0,'TChatRichEdit',nil);
  SendMessage(h6, WM_Settext, 0,integer(pchar('<u>я тут.</u>')));
  SendMessage(h6, WM_KEYDOWN,VK_SHIFT ,0 );
  SendMessage(h6, WM_KEYDOWN,VK_CONTROL ,0 );
  SendMessage(h6, WM_KEYDOWN,VK_RETURN ,0 );
  SendMessage(h6, WM_KEYUP, VK_RETURN, 0);
  SendMessage(h6, WM_KEYUP,VK_SHIFT ,0 );
  SendMessage(h6, WM_KEYUP,VK_CONTROL ,0 );
end;
end.

надеюсь вы суть поняли=))
нужно отправить текст форматированный html'ом=)
в скайпе отправляеться сочетанием клавиш ctrl+shift+левая кнопка мыши.
enter'ом не отправляет.
Ответить с цитированием
  #13  
Старый 14.02.2012, 18:45
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

пример работы той функции, для поиска картинки на экране
(особенность: при поиске использует только первую полоску, т.е. what должна но не обязана быть высотой в 1px)
Вложения
Тип файла: zip clicker.zip (6.7 Кбайт, 58 просмотров)

Последний раз редактировалось Pyro, 05.03.2013 в 07:26.
Ответить с цитированием
  #14  
Старый 14.02.2012, 20:27
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

Pyro,значит мне нужно в image1 вставить картинку моей кнопки со скайпа?
как в 1 посте например картинка.
Ответить с цитированием
  #15  
Старый 14.02.2012, 20:31
Аватар для St0rm
St0rm St0rm вне форума
Прохожий
 
Регистрация: 13.02.2012
Сообщения: 12
Репутация: 10
По умолчанию

есть еще API,предоставляемый скайпом.Skype4com,но там я не нашёл как отправить текст форматированный html'ом.по возможности гляньте пожалуйста.
p.s. другого выхода кроме предложенного Pyro нету?))
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter