package pl.asseco.amms.common.utils; - widzę, że kolega z Asseco :) - takie podejrzenia wzbudza ten pakiet ;)
Dzięki za zainteresowanie tematem - nie działało, bo nie akceptowało funkcji FindWindow, ale FindWindowA już przeszło. Z FindWindowW też jest jakiś problem.
Zbudowałem jednak jeszcze inny program - korzystam z EnumWindows i EnumChildWindows. Potrafię odnaleźć konkretne okno i pobrać jego wszystkie komponenty. Wiem, że poszczególne komponenty mają swoje ID, po którym mogę ustalić, czy dany komponent to button, pole tekstowe, czy coś innego.
GetWindowTextA dla głównych okien pozwala pobrać nazwę okna. Czytałem gdzieś, że w taki sposób można pobrać tekst z pola tekstowego. Ale u mnie pobiera pusty string. Na dole jest kod. Coś jest nie tak ? Cały program ma polegać na tym, że wklejam tekst w jedno pole tekstowe, klikam guzik, wynik pojawia się standardowo na skutek specyfiki działania danej aplikacji desktopowej w drugim polu tekstowym i ja sobie ten przerobiony tekst pobieram. Na razie nie wiem jak wkleić tekst, jak przechwycić ID (gdzieś mi informacja przepadła), jak kliknąć w guzik i pobrać tekst (co pewnie wygląda podobnie do wklejenia tekstu).
Czarnoksiężnicy z Asseco specjalizują się w C++ i trochę w Javie też, więc liczę na pomoc :).
Poniżej kod:
Klasa FindWindow - wykonuje opisany wyżej algorytm
package winapi;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.PointerType;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinUser.POINT;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.WString;
public class FindWindow {
public static void main(String[] args) {
String title = "Nazwa okna";
//Poprzedni sposób szukania okna
//HWND window = User32.INSTANCE.FindWindowA(null, title);
//System.out.println(window.toString());
WndEnumProc wnd = new WndEnumProc() {
int count;
public boolean callback(HWND hWnd, Pointer lParam) {
byte[] windowText = new byte[512];
User32.INSTANCE.GetWindowTextA(hWnd, windowText, windowText.length);
String wText = Native.toString(windowText);
wText = (wText.isEmpty()) ? "" : "; text: " + wText;
if (wText.contains("Nazwa")){
System.out.println("Found window " + hWnd + ", total " + ++count + wText);
WndEnumProc chWnd = new WndEnumProc() {
int compCount;
public boolean callback(HWND hWnd, Pointer lParam) {
byte[] componentText = new byte[1024];
User32.INSTANCE.GetWindowTextA(hWnd, componentText, componentText.length);
String cText = Native.toString(componentText);
cText = (cText.isEmpty()) ? "" : "; text: " + cText;
System.out.print("Found component " + hWnd + ", total " + ++compCount + cText);
System.out.println("; Is visible: " + User32.INSTANCE.IsWindowVisible(hWnd));
return true;
}
};
User32.INSTANCE.EnumChildWindows(hWnd, chWnd, null);
}
return true;
}
};
User32.INSTANCE.EnumWindows(wnd, null);
}
}
Interfejs User32 - nie wszystkich metod używam w klasie powyżej
package winapi;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.win32.StdCallLibrary;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
HWND FindWindowA(String lpClassName, String lpWindowName);
boolean IsWindow(HWND hWnd);
boolean EnumWindows(WndEnumProc wndenumproc, Pointer lParam);
boolean EnumChildWindows(HWND hWnd, WndEnumProc wndenumproc, Pointer lParam);
int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);
int GetMessageA(MSG lpMsg, HWND hWnd, int wMsgFilterMin, int wMsgFilterMax);
HWND GetForegroundWindow();
boolean IsWindowVisible(HWND window);
public static class MSG extends Structure {
public WinDef.HWND hWnd;
public WinDef.LPARAM lParam;
public int message;
public POINT pt;
public int time;
public WinDef.WPARAM wParam;
}
public static class POINT extends Structure {
public int x, y;
}
}
Interfejs WndEnumProc - do stworzenia klasy, której obiekt jest argumentem metod do wyszukiwania okien
package winapi;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
public interface WndEnumProc extends StdCallCallback {
boolean callback(HWND hWnd, Pointer lParam);
}