[delphi] Получение инфы с чужого окна

Тема в разделе "Другие языки", создана пользователем Ser Frood, 12 май 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    522
    Симпатии:
    386
    Народ подскажите как плучить инфу с определённого окна! пример:
    Есть окно, там где есть числовое значение, оно постоянно изменяется ,как вот определять это числовое значение чужого окна, на дельфи??
     
  2. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Получаешь хендл нужного приложения (например, по заголовку окна), а потом с помощью sendmessage творишь с ним что угодно.
     
  3. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    522
    Симпатии:
    386
    Гы это знает любой) а ты преведи примером как с чужого окна содрать текст например с оперы с поля url!!
     
  4. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Получить Handle поля ввода адреса в Опере не удастся, все сообщения берет на себя тулбар, на котором лежит combobox с адресом. Адрес можно получить следующим образом (проверял на D7:(

    Код:
    uses DdeMan;
    function GetURL(Browser: string): string;
    var
     Client_DDE: TDDEClientConv;
     temp: PChar;
    begin
     Result := '';
     Client_DDE:= TDDEClientConv.Create( nil );
     with Client_DDE do
      begin
       SetLink(Browser, 'WWW_GetWindowInfo');
       temp := RequestData('0xFFFFFFFF');
       Result := StrPas(temp);
       // оставляем только урл
       Delete(Result, Pos(',', Result), Length(Result)-Pos(',', Result)+1);
       // удаляем кавычки
       Delete(Result, 1, 1);
       Delete(Result, Length(Result), 1);
       StrDispose(temp);
       CloseLink;
      end;
     Client_DDE.Free;
    end;
    ShowMessage(GetURL ('Opera'));
     
  5. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    522
    Симпатии:
    386
    Это пример как получить урл пробузера) лан сделую другой пример!
    Имеется игра lineage так вот надо получить счётчик HP персоонажа))) то есть обратиться в чужое окно забрать текст и вывести))
     
  6. o_nix

    o_nix

    Регистр.:
    7 ноя 2007
    Сообщения:
    1.073
    Симпатии:
    1.037
    Seregakz - конечное предназначение проги какое будет ???
    я не специалист в плане игр и прочего гейма :D про lineage тока слышал ...
    Не проще воспользоваться чужими трудами ...??
    Уже много лет еcть прога ArtMoney работает со всеми популярными играми настроить её и всё будет показываться и выводиться как вам надо... :)
    Как вариант выдёргивать данные из directx или opengl как оно там работает хер его знает ...
    ещё как вариант настроить какуюто прогу (таких много) или написать свою чтобы делала скриншот определённой области экрана и сохраняла в картинку распознав котрую можно получить искомые данные ... :D

    Наверняка есть какиенибудь боты под ланейдж если они "HP" отображают изучи их в дебагере можно узнать очень много интересного ...
    Это намного проще чем саму lineage в дебагер подгружать ... :D
     
    jik нравится это.
  7. Zveros

    Zveros Постоялец

    Регистр.:
    24 ноя 2008
    Сообщения:
    110
    Симпатии:
    10
    У меня была подобная проблемма. С эдита, лэйбла и прочего вроде работает. А вот с других компонентов ничего не получится. Если графика 3D то геморая я думаю будет много.
     
  8. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20

    Тогда вообще проблем никаких )) Главное, найти нужный класс в иерархии, можно дебаггером перебрать либо чем-то вроде winspy++ воспользоваться.
    Приведенный код выводит строку адреса в эксплорере. У меня стоит шестой, в седьмом-восьмом иерархия чуть другая. Дельфи не знаю, с шарпея думаю сконвертишь.


    Код:
     private IntPtr FindClass(IntPtr hwndParent, string sClassNameToFind)
            {
                STRINGBUFFER sbClassName;
                IntPtr hControl = FindWindowEx(hwndParent, IntPtr.Zero, null, null);
               
                while (hControl != IntPtr.Zero)
                {
                    GetClassName(hControl, out sbClassName, 256);
                    String sClassName = sbClassName.szText;
    
                    if (sClassName == sClassNameToFind)
                        break;
    
                    hControl = FindWindowEx(hwndParent, hControl, null, null);
                }
    
                return hControl;
            }
    
     private void button1_Click(object sender, EventArgs e)
            {
                int iLen = 0;
    
                IntPtr hWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "IEFrame", null);
                IntPtr hControl = FindClass(hWnd, "WorkerW");
                hControl = FindClass(hControl, "ReBarWindow32");
                hControl = FindClass(hControl, "ComboBoxEx32");
                hControl = FindClass(hControl, "ComboBox");
                hControl = FindClass(hControl, "Edit");
    
          
                //Получаем длину текста в строке URL
                iLen = SendMessage(hControl, WM_GETTEXTLENGTH, 0, null);
                StringBuilder sb = new StringBuilder(iLen + 1);
                //Получаем сам текст
                SendMessage(hControl, WM_GETTEXT, iLen, sb);
    
                MessageBox.Show(sb.ToString());
              
            }
    
     
  9. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    522
    Симпатии:
    386
    o_nix **х мне армани если мне надо чисто вести контроль над HP перса и всё и нечего не менять!??
    MadWizard так и неразобрался с твоим примером ))
    не вкурсах какой прогой мона снифануть число в игре? (чтобы узнать имя переменой в которой число хранится)
     
  10. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20

    http://www.artmoney.ru/rus.htm
     
Статус темы:
Закрыта.