淡定0606 2015-06-18 08:46 采纳率: 100%
浏览 3347
已采纳

C#求大神给看看,句柄没问题,可以SengMessage,getGetWindowText取不到值

C#求大神给看看,句柄没问题,可以SengMessage,为什么不能getGetWindowText取不到值

[DllImport("user32.dll", EntryPoint = "GetWindowText")]
public static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);

    private void timer1_Tick(object sender, EventArgs e)
    {
        string s = "";
        int i = GetWindowText(curr_hWnd, s, 10);
        if (s != "")
        {
            this.timer1.Stop();
            MessageBox.Show(s);
        }
    }
  • 写回答

1条回答 默认 最新

  • 不是阿尔伯特 2015-06-18 09:01
    关注
    int WINAPI GetWindowText(
      _In_  HWND   hWnd,
      _Out_ LPTSTR lpString,
      _In_  int    nMaxCount
    );
    
    

    微软对GetWindowText的定义是这样的。在调用的时候,lpString是一个缓冲区,它是必须有长度的,而它的长度是nMaxCount,也即使告诉Windows,别写超过nMaxCount长的字符串到lpString里面去。
    看你的调用方式,s="",也就是说0长度的字符串。然后调用的时候给了他一个10个长度,说是你的缓冲区最大长度。别说不给你数据,它不跳一个异常出来我已经觉得很惊讶了。
    正确的用法是:先初始化你的s,给它一定的长度,比如说用255个空格来初始化它。然后去调用,调用的时候长度就填255.
    另外,你的i是返回值,但是扔在一边不用。这个返回值是告诉你返回的字符串的长度(是字节数,不是Unicode的字符数)。虽然有'\0'作为字符串的结束符,但是遇到多字节的是有可能出问题的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 海康威视如何实现客户端软件对设备语音请求的处理。
  • ¥15 支付宝h5参数如何实现跳转
  • ¥15 MATLAB代码补全插值
  • ¥15 Typegoose 中如何使用 arrayFilters 筛选并更新深度嵌套的子文档数组信息
  • ¥15 前后端分离的学习疑问?
  • ¥15 stata实证代码答疑
  • ¥50 husky+jaco2实现在gazebo与rviz中联合仿真
  • ¥15 dpabi预处理报错:Error using y_ExtractROISignal (line 251)
  • ¥15 在虚拟机中配置flume,无法将slave1节点的文件采集到master节点中
  • ¥15 husky+kinova jaco2 仿真