Odczytanie zawartości kontrolki edit przy użyciu SendMessageA

0

Aby zobrazować mój problem posłużę się skryptem znalezionym w internecie. Otóż ma on za zadanie odczytać zawartość kontrolki Edit w notatniku windowsowym.

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.win32.StdCallLibrary;

public class GetTextInNotePad {
   public static final String NOTEPAD_CLASS = "Notepad";
   public static final String EDIT_CLASS = "Edit";

   interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      int WM_SETTEXT = 0x000c;
      int WM_GETTEXT = 0x000D;

      HWND FindWindowA(String lpClassName, String lpWindowName);
      HWND FindWindowExA(HWND hwndParent, HWND hwndChildAfter, String lpClassName,
            String lpWindowName);
      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM, LPARAM paramLPARAM);
      LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
      int GetClassNameA(HWND hWnd, byte[] lpString, int maxCount);
   }

   public static void main(String[] args) {
      User32 user32 = User32.INSTANCE;
      String lpClassName = "Notepad";
      HWND notePadHwnd = user32.FindWindowA(lpClassName , null);
      HWND editHwnd = user32.FindWindowExA(notePadHwnd, null, EDIT_CLASS, null); 
      byte[] lParamStr = new byte[512];
      LRESULT resultBool = user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr);

      System.out.println("lParamStr: " + Native.toString(lParamStr));
   }
}

I właśnie z odczytaniem treści pojawiają się problemy, ponieważ o ile całość działa bez zarzutu w Win 8.1 64bit to w przypadku Win7 32bit SendMessageA:

 user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr)

już nie działa tak jak powinien i zwraca za każdym razem 0.

skrypcik pochodzi stąd gdzie piszą że 'I was using a 32bit JRE, just switched to a 64bit JRE and everything worked just fine'

Co Wy o ty sądzicie?

Dlaczego tak się dzieję i gdzie mógłbym znaleźć ewentualne rozwiązanie tego problemu?

0

Wygląda na to że wersja zainstalowanej javy ma jednak najwyraźniej w tym przypadku duże znaczenie.

Tak jak pisałem wyżej - skrypt działa na stacji Win8.1 64bit z zainstalowaną javą 64bit a nie działał na stacji Win7 32bit z zainstalowaną javą 32bit i z ustawionym typem zmiennej::

 long
 
   interface User32 extends StdCallLibrary {
     ...      
      LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
      ...
   }

Dopiero gdy na stacji Win7 32bit z zainstalowaną javą 32bit typ zmiennej zmieniłem na:

 int
 
   interface User32 extends StdCallLibrary {
     ...      
      LRESULT SendMessageA(HWND editHwnd, int wmGettext, int i, byte[] lParamStr);
      ...
   }

to rozwiązało problem.

Natomiast dla mnie jako dla laika nasuwa się pytanie dlaczego typ zmiennej long działa w 64bit a typ zmiennej int działa w 32bit. Byłbym wdzięczny jeżeli ktoś nakierowałby mnie na te informacje.

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