Я пытаюсь составить список и получить содержимое элементов управления редактирования из внешнего окна в C ++ / Java, к сожалению, безуспешно.
Когда я вызываю GetWindowText или GetWindowTextA, он возвращает пустое значение в элементах управления Edit, я знаю, что есть некоторые различия между GetWindowText / GetWindowTextW и GetWindowTextA, но я не знаю, что я делаю неправильно, так как это работает на всех других элементах управления.
Вот код C ++:
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
cout <<"----------CHILD------------"<<endl;
char class_name[80];
char title[80];
GetClassName(hwnd,class_name, sizeof(class_name));
GetWindowText(hwnd,title,sizeof(title));
cout <<"\tWindow title: "<<title<<endl;
cout <<"\tClass name: "<<class_name<<endl<<endl;
return TRUE;
}
Java-код:
User32.INSTANCE.EnumChildWindows(hWnd, new User32.WNDENUMPROC() {
@Override
public boolean callback(Pointer hWnd, Pointer arg) {
byte[] windowClassx = new byte[512];
User32.INSTANCE.GetClassNameA(hWnd, windowClassx, 512);
String wClass = Native.toString(windowClassx);
System.out.println(" - Found sub window / control class: " + new String(windowClassx).trim());
if (wClass.toLowerCase().equals("edit")){
byte[] windowTextx = new byte[128];
user32.GetWindowText(hWnd, windowTextx, 128);
String wText = Native.toString(windowTextx);
System.out.println(wText);
}
return true;
}
}, null);
Я не уверен, что является причиной вашей проблемы, но для меня это сработало:
byte[] windowText = new byte[512];
User32.INSTANCE.GetWindowTextA(hWnd, windowText, 512);
String wText = Native.toString(windowText).trim();
редактировать
Вы должны получить текст для редактирования другим способом, через
User32.SendMessageA(editHwnd, User32.WM_GETTEXT, paramWPARAM, lParamStr);
например.,
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));
}
}
Других решений пока нет …