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.

- Rejestracja:ponad 19 lat
- Ostatnio:prawie 12 lat
- Rejestracja:około 20 lat
- Ostatnio:ponad 11 lat
http://tronche.com/gui/x/xlib/window-information/XQueryTree.html - nie wiem czy w javie do tego sie dokopiesz

- Rejestracja:ponad 17 lat
- Ostatnio:ponad 2 lata
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

- Rejestracja:ponad 17 lat
- Ostatnio:ponad 2 lata
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