Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java-программа и Windows-приложение, можно ли их как-то синхронизировать? 
V
    Опции темы
check
Дата 4.11.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Здравствуйте! Бьюсь над этой проблемой уже неделю.
Необходимо(ну или по-крайней мере желательно) в одной программулине под Windows автоматизировать последовательность действий, которая будет повторятся очень часто, и для большей дружественности пользователю хотелось бы его, пользователя, от лишней работы избавить. 
Все действия будут выполнятся с клавиатуры. 
Таким образом задача разделяется на две части. 
Первое - эмуляция клавиатуры. С этим я уже разобрался.
Второе - нужно синхронизировать Java-программу, которая эмулирует нужную последовательность действий, с программой, в которой эти действия должны быть выполнены. Вот это уже фокус посложнее, я по-крайней мере не знаю как это можно сделать. 
То есть выглядеть это должно так: обычным образом запускаем нашу программу и как только её окно активизируется, запускается Java-эмулятор и начинает "жать на кнопки", начиная с клавиши alt(чтобы забраться на меню). 
Только вот как сделать чтобы он запускался. 
Вообще вопрос скорее по форточкам, чем по Java. Я задал вопрос в соответствующем разделе, но там что-то безмолвствуют.
Так что если считаете, что вопрос к Java ну совсем не имеет отношения, можно ответить здесь.
PM MAIL   Вверх
powerOn
Дата 4.11.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(check @  4.11.2006,  14:27 Найти цитируемый пост)
Только вот как сделать чтобы он запускался. 

Никак. Ручками запускать. 

Или написать программу которая бы стартовала 2 процесса. 
Т.е. запускаете её, будто запускаете основную Windows программу, а она, на самом деле, запускает оригинальную программу, а потом java программу. При этом данный загрузчик можно написать на Java, благо возможность есть. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
check
Дата 4.11.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



А как вообще запустить стороннюю программу? Пол инета перерыл, но не нашёл.
Понял только, что нужно наследовать класс от класса Thread и переопределить метод run().  А что в методе run писать?
PM MAIL   Вверх
powerOn
Дата 4.11.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



тут посмотри.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 4.11.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538





--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
check
Дата 4.11.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Всё сделал, огромное спасибо за помощь!
Надо сказать, если ещё сделать sleep между событиями клавы, выглядит очень эффектно, прямо полтергейст какой-то!
Но этого я конечно делать не буду, зачем пугать людей.  smile 
Представте запускаете вы себе какой нибудь ексель, а у вас вдруг начинают сами собой меню выдвигаться, курсор бегает сам по себе.
Извиняюсь за оффтопик, конечно, перевозбудился...

P.S. Всё таки жаль, что нельзя стартовать с основной программы.
PM MAIL   Вверх
check
Дата 6.11.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Только почему-то Enter не нажимается.

Код

import java.awt.*;

class KeyEmulator {
  

  public void pressKey(int key) {
    try {
      Robot rb=new Robot();
      rb.keyPress(key);
      rb.keyRelease(key);
    }
    catch (AWTException ex) {};
  }
}

public class Key extends Thread {

  public static void main(String[] args) {
      //массив десятичных кодов клавиш
      int keys[] = {18,40,40,40,40,38,38,38,39,40,40,40,40,38,38,38,38,39,40,13}; 
      try 
       {
         KeyEmulator em = new KeyEmulator();
         for (int i=0; i < keys.length; i++) {
           em.pressKey(keys[i]);
           sleep(200); //это просто для прикола
         }
       }
       catch(Exception ex) {}
    
  }
}


Десятичный код клавиши Enter, если не ошибаюсь 13. 
События от других клавиш проходят нормально.
PM MAIL   Вверх
LSD
Дата 6.11.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Используй константы из KeyEvent: KeyEvent.VK_ENTER, KeyEvent.VK_UP и т.д.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
check
Дата 6.11.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Спасибо, всё нажимается.
Десятичный код Enter видимо не срабатывал просто потому что число такое  smile 
PM MAIL   Вверх
check
Дата 14.1.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Неожиданное продолжение темы  smile 

По независящим от меня причинам последовательность действий, 
которую должен выполнить мой "эмулятор пользователя" изменилась.

Появилась необходимость получить фокус ввода или попросту говоря поставить курсор
в поле при помощи мыши.  Ни Tab, ни какие другие клавиши не позволяют этого сделать.

Для того чтобы эмулировать щелчок мышью в поле нужно сначала переместить "мышь" 
в нужную позицию 
Код

mouseMove(int x, int y)

Вопрос в том как получить координаты x и y.   Я знаю, что в Java есть методы позволяющие получить координаты мыши в момент возникновения события, но события ловятся только если
они произошли в окне Java-приложения, а в данном случае это не так. 

Как получить координаты поля, в которое мне нужно поставить курсор?


 
PM MAIL   Вверх
LSD
Дата 15.1.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(check @  14.1.2007,  00:03 Найти цитируемый пост)
Как получить координаты поля, в которое мне нужно поставить курсор?

Текущее положение мыши можно получить:
Код
MouseInfo.getPointerInfo().getLocation()

не знаю правда поможет ли.

А вообще только OCR smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
unkis
Дата 15.1.2007, 13:15 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



извините может это немного не в  тему, но существуют же программы для тестов приложения, они как-то отлавливают какие-то windows message, и тем самым могут влиять на приложения.

Я всего этого не знаю а просто где-то слышал.
Но если это так, то может можно тоже отловить эти mesage?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Metal_Heart
Дата 15.1.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



unkis, да, я тоже это краем глаза видел, даже кнопки нажимал виртуально  smile 
check, ты лучше к Сишникам сходи, они тебя научат как с виндовой формой обращаться  smile 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Alexandr87
Дата 15.1.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Вощем, вам нужно в раздел c-winapi.

Есть ли смысл делать это на Java? По-любой для фокуса с определением координат контрола нужно испольозовать winapi функции, следоавтельно писать библиотеку и jni к ней, может стоит всеж обойтись средствами winpi.
PM Jabber   Вверх
check
Дата 15.1.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Цитата(Alexandr87 @  15.1.2007,  15:41 Найти цитируемый пост)
Есть ли смысл делать это на Java? 

Я делаю это на Java, потому что на PHP этого точно не сделать  smile 

PM MAIL   Вверх
Metal_Heart
Дата 16.1.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



Цитата(Alexandr87 @  15.1.2007,  15:41 Найти цитируемый пост)
По-любой для фокуса с определением координат контрола нужно испольозовать winapi функции, следоавтельно писать библиотеку и jni к ней


А что будет делать Java? Создавать форму с кнопочками и передавать управление нативному коду?
Нативный код всё-равно на Срр писать придется.

Выбранный тобою подход, в данном случае  может оправдать себя, только если пишешь кросс-платформенное приложение! Иначе - лучше не стоит, честное слово!



--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Alexandr87
Дата 16.1.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



код на с с использованием winapi для получения левого верхнего угла контрола
Код

#include <stdio.h>

#include <windows.h>





int main(int argc, char* argv[])

{



    HWND mainWnd = FindWindow("SciCalc",NULL);

    

    if (!mainWnd)

        return 1;



    HWND temp = FindWindowEx(mainWnd,NULL,"Static",NULL);



    int check = false;

    char title[100];

    while (true) {

        GetWindowText(temp,title,100);

        if (strcmp(title,"")!=0)

            break;

        temp = FindWindowEx(mainWnd,temp,"Static",NULL);

        if (!temp) 

            return 1;

    }





    RECT rect;



    GetWindowRect(temp,&rect);



    printf("left:%d,top:%d\n",rect.left,rect.top);





    return 0;

}




данная функция, ищет контрол для (ввода/вывода)  в стандратной windows-прогамме калькулятор.
Немного по коду
    HWND mainWnd = FindWindow("SciCalc",NULL);

каждое окно в windows имеет свой класс и имя, в данном случае SciCalc - класс окна программы калькулятора.
Для того, чтобы посмотреть какой класс у нужного тебе окна есть специальные программы типа Spy++

После того как ты окно контрола, нужно найти сам контрол

    HWND temp = FindWindowEx(mainWnd,NULL,"Static",NULL);

процедура расширенного поиска окна, первый параметр - окно предок, второй параметр предыдущее найденный контрол(класс и имя контролла не однозначно идентифицируют окно в в системе, поэтому просматриваются все контролы родительского окна данного класса), у окна, которое нас интересует имя окна изменяется динамечески, но никогда не равно пустоте, остальные два параметра как и у функции  FindWindow. Так, что правь код, под нужные тебе окна, делай dll, читай про JNI - и дерзай.
PM Jabber   Вверх
check
Дата 17.1.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Alexandr87,  я запустил этот код на Borland Builder 6, вот что выдает:
[
Код

Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl

PM MAIL   Вверх
Alexandr87
Дата 17.1.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



откомпилируй в Visual C++,  я ваще Borlфndom не пользовался, так что не знаю
PM Jabber   Вверх
Metal_Heart
Дата 17.1.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



check, сходи в раздел С++ там тебе быстрее помогут,  а что касаемо Явы - спрашивай сдесь.
А то как-то ... 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
check
Дата 17.1.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Metal_Heart,  да,  я и сам уже собирался. 
Просто по инерции...
Тут будем считать тему как бы прикрытой.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.