Java [1242]

Zapisz się
Dodaj kartkę Dodaj bana
Powód wlepienia kartki
Wybierz wątek docelowy z listy lub wpisz jego ID
  • Kamiox

    Potrzebuje zrobić program, który działa zawsze na wierzchu i pobiera automatycznie, zaznaczony w danej chwili tekst w dowolnej aplikacji. Podejrzewam, że coś takiego może być nie możliwe przy użyciu api javy, więc pewnie będę musiał się zadowolić pobieraniem tekstu ze schowka, czyli działa to tak, że zaznaczam w jakiejś aplikacji tekst, kopiuje do schowka, a wtedy mój program automatycznie pobiera ten nowy tekst ze schowka. I moje pytanie jest takie w jaki sposób mogę przechwycić ten tekst zaraz po wrzuceniu go do schowka.

    Myślałem, że jak zrobię swój handler, który implementuje interfejs FlavorListner, to potem jak go dodam do: clipboard.addFlavorListener(ne w ClipBoardHandler());

    to metoda: public void flavorsChanged(FlavorEvent e) będzie wywoływana przy każdej zmianie w schowku, jednak tak się nie dzieje. Jeśli w ten sposób się nie da, to jak to mogę zrobić? Myślałem, żeby stworzyć w jakimś wątku, funkcje, która co jakiś czas sprawdza czy dane w schowku się nie zmieniły, ale nie wiem czy to jest dobry pomysł. Może ktoś by rzucił przykładowym kodem, jakby to mogło wyglądać?
  • Anonim

    Interfejs FlavorListener jest przydatny, gdy chcesz stwierdzić, że zmianie uległ format zawartości schowka. Natomiast w Twoim przypadku klasa musi implementować interfejs ClipboardOwner, ktorej metoda lostOwnership powiadamia, że zawartość schowka się zmieniła. Pamiętaj jednak, że metoda ta zostanie wywołana tylko wtedy, gdy wcześniej schowek zawiera dane pochodzące z klasy implementującej ten interfejs, a nie z zewnętrznego źródła.

    Pozdrawiam
  • steelheart

    tylko że CO zadziala raz przy pierwszym kopiowaniu w dodatku do czasu powrotu na aplikacje nie pozwoli dobrac sie do zawartosci schowka (praktykowane na windows) wiec lipa :/

    sa platne biblioteki robiace to po JNI i to chyba jedyna pewna metoda...
  • owczi

    Może to i wiejski pomysł, ale jeśli są problemy z listenerami to można by napisać biedniutkiego timera który by powiedzmy co sekundę czy może i częściej sprawdzał zawartość schowka (może nie całą tylko powiedzmy robiłby jej hash sha1). Ale jeśli rzeczywiście Toolkit.getDefaultToolkit().ge tSystemClipBoard().getContents () działa tylko kiedy mamy focus na naszym oknie... Pozostaje napisanie prostej dll-ki JNI która by udostępniała ze dwie metody - odczytaj schowek i zapisz schowek, i dobranie się do niej.
  • steelheart

    heh. gdy probujesz dostac sie do schowka gdy nie masz focusu na swojej aplikacji to operacje na schowku sypia wyjatkami :/
    afaik JNI to narazie jedyna droga do czegos takiego...
  • owczi

    Właśnie zrobiłem test (JRE1.5.0_04):

    new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent actionEvent) {
    try {
    System.out.println(
    Toolkit.getDefaultToolkit().
    getSystemClipboard().
    getContents(this).
    getTransferData(DataFlavor.str ingFlavor)
    );
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }).start();

    No i zadziałało(?) bez wyjątków. Aplikacja zminimalizowana, albo w oknie w tle, albo na pierwszym planie.

  • Anonim

    >steelheart napisał
    >tylko że CO zadziala raz przy pierwszym kopiowaniu
    Niekoniecznie. Jeśli w metodzie lostOwnership przepiszesz zawartość schowka, to efekt bedzie taki, ze będzie on zawierał zawartość pochodzącą z innej aplikacji, a jednocześnie będzie jej właścicielem, więc przy następnym kopiowaniu również zadziała.

    >w dodatku do czasu powrotu na aplikacje nie pozwoli dobrac sie
    >do zawartosci schowka (praktykowane na windows) wiec lipa
    >:/
    A to czemu? Ostatnio robiłem mojej dziewczynie taką aplikacyjkę pod windowsa, która po skopiowaniu tekstu z zewnętrznej aplikacji od razu zapisywała ją do osobnego pliku. Działa jak marzenie :)

    Sprawdzanie zawartosci schowka co sekunde, czy iles tam jest imho karkołomnym pomysłem, a jego użycie w tym przypadku zupełnie nieuzasandnione :)





  • owczi

    Czytaj uważnie... To jest prymitywne rozwiązanie napisane po pierwsze dla testu (że wyjątki), a po drugie z poprzedniej dyskusji wynikało, że są problemy z monitorowaniem stanu schowka. Poza tym gdybyśmy zastosowali JNI, to spróbuj monitorować schowek w inny sposób niż cykliczne sprawdzanie go.
  • Kamiox

    Co monitorowania stanu schowka, to wygląda u mnie to tak, że pod Windowsem działa poprawnie, pod Linuksem w aplikacjach napisanych w Java, lub opartych o GTK również działa, ale kiedy spróbuje skopiować coś z aplikacji opartej o QT, np. kadu, zdarzenie w ogóle nie jest wykrywane.
  • owczi

    No z QT możesz mieć problem, w sumie nigdy nie programowałem w QT, ale zastanawiam się jak środowiska typu KDE, XFCE, GNOME monitorują schowek - mają applety obsługujące schowek które działają jakoś niezależnie od toolkitu. Ale na pewno nie działa dla żadnej aplikacji pod QT? Opera, Konqueror, cokolwiek? Potestuj jak zachowuje się to pod managerem okien opartym o QT, a jak pod takim opartym o GTK.