GetWindowTextA,GetWindowText在Edit Control上返回空值

我试图在C ++ / Java中从外部窗口列出并获取编辑控件的内容,遗憾的是没有成功。

当我调用GetWindowText或GetWindowTextA时,它会在Edit Controls上返回一个空值,我知道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)); } }