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

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 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办