Javowe "EmumWindows"

0

Witam,
pisze program w javie na systemy win/linux. Warunkiem dzialania powinno byc odnalezienie innej aplikacji okienkowej. Tu rodzi sie problem, w windosowym API uzylbym funkcji EnumWindows i gotowe. Na dzien dzisiejszy program robi screena i szuka okienka, co jak latwo przewidziec jest bardzo naciagane i tak zostac nie moze.
Jest szansa na czysto javowe rozwiazanie wyszukiwania okna innej aplikacji? Interesuje mnie czy okno jest widoczne, jego rozmiar i polozenie.

0

Java ma coś co się nazywa Java Native Interface (JNI) - możesz więc napisać swoja bibliotekę funkcji natywnych dla każdego z systemów. Poszukaj po necie pewnie juz ktoś napisał cos co potrzebujesz np JwinApi.

0

http://tronche.com/gui/x/xlib/window-information/XQueryTree.html - nie wiem czy w javie do tego sie dokopiesz

0

Witaj

Sam się męczyłem z tym kilka tygodni temu...otóż nic nie zabrania Ci użycia tej metody z user32.dll.
I nie musisz używać JNi, które ma wady (trzeba napisać przejściową bibliotekę).
Rozwiązaniem jest JNA:

Poniżej przedstawie kody 3 plików java, po uruchomieniu dostaniesz wszystkie okna (uchwyty oraz ich nazwy), które są w systemie.

Plik EW.java

package testowy;


/**
 *
 * @author lipkerson
 */
import com.sun.jna.Native;

public class EW
{
   public static void main (String [] args)
   {
      final User32 lib = (User32) Native.loadLibrary ("user32", User32.class);

      final byte [] title = new byte [256];


      WndEnumProc wndenumproc;
      wndenumproc = new WndEnumProc ()
                        {
                           public boolean callback (int hWnd,  int wParam)
                           {
                              System.out.printf ("hWnd = %d\n", hWnd);
                              System.out.printf ("wParam = %d\n", wParam);

                              if (lib.GetWindowTextA (hWnd, title, 255) != 0)
       System.out.printf ("Top window: [%s]\n",new String (title).trim ());

                              
                              for (int i = 0; i < title.length; i++)
                                   title [i] = ' ';
                              return true;
                           }
                        };

                        
      System.out.println (lib.EnumWindows (wndenumproc, null));
   }
}

Plik User32.java

package testowy;

/**
 *
 * @author lipkerson
 */
import com.sun.jna.Native;

import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public interface User32 extends StdCallLibrary {
    boolean EnumWindows(WndEnumProc wndenumproc, Pointer lParam);
   int GetWindowTextA(int hWnd, byte[] lpString, int nMaxCount);
}

Plik WndEnumProc.java:

package testowy;

/**
 *
 * @author lipkerson
 */
import com.sun.jna.win32.StdCallLibrary;

import com.sun.jna.Structure;



public interface WndEnumProc extends StdCallLibrary.StdCallCallback
{
   boolean callback (int hWnd,  int wParam);
}

Jak widać jest to najzwyklejszy callback-definiuje się postać obiektu, który ma byc wykorzystany
gdy windows wyśle listę okienek wraz z parametrami.

W interfejsie user32 są zdefiniowane metody, które zawiera sam user32.dll.
Wywyłuje sie te metody bezpośrenio tak jakbyśmy mieli dostęp do normalnych metod javowych.

Strona projektu:
https://jna.dev.java.net/
Strona do bibliotek
https://jna.dev.java.net/servlets/ProjectDocumentList?folderID=12139&expandFolder=12139&folderID=0

Gdyby coś było nie jasne z chęcią wytłumaczę ale jak się ma przykłąd to łatwo dojsć co jest co.
pozdrawiam

0

Sam się męczyłem z tym kilka tygodni temu...otóż nic nie zabrania Ci użycia tej metody z user32.dll.

Nawet pod Linuksem? Bo o tym był wątek

0

Pewnie.

0

Jestes pewien ze user32.dll jest i dziala pod linuxem?

0

Hmm...nie no oczywiście że nie user32.dll no bo co ma windows do linuxa i vice wersa. Rejestrowanie i zapisy okien trochę jednak się różnią. Chodziło mi o to, że jezeli ktoś pisał kiedyś np. w C++ pod windows to wie, ze można skorzystać z metod z user32.dll do rejestracji okna. Właśnie tak zaczyna się post pytającego-"jakby było winapi to bym zrobił tak, ale nie jest...więc?".

Skoro pytający pisze aplikację która ma korzystać tak samo z danych rejestracji okna z windows jak i linux to zakłądam, ze wie jak w c++ rejestruje się i zapisuje okna pod linuchem, więc koncepcja jest identyczna a schemat podobny.

Jeżeli natomiast pytający chce tylko zastosować jakas gotową szybką metodę do tak skomplikowanej jednak rzeczy jak rejestracja okien pod dwoma różnymi systemami to niestety ale nie orientuje się w tym zakresie.

Pozdraiwam

1 użytkowników online, w tym zalogowanych: 0, gości: 1