GetWindowTextA、GetWindowText 在编辑控件上返回空值

2024-04-23

我正在尝试从 C++/Java 的外部窗口列出并获取编辑控件的内容,不幸的是没有成功。

当我调用 GetWindowText 或 GetWindowTextA 时,它在编辑控件上返回空值,我知道 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();

Edit
您应该以不同的方式获取编辑文本,通过

User32.SendMessageA(editHwnd, User32.WM_GETTEXT, paramWPARAM, lParamStr);

e.g.,

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));
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetWindowTextA、GetWindowText 在编辑控件上返回空值 的相关文章

随机推荐