GetWindowText 和子字符串

如何解决GetWindowText 和子字符串

我在使用

获取子字符串时遇到问题
strstr(a,b);

检查“FiveM”名称是否出现在窗口的标题栏中,因为通常在这个游戏中标题栏也包含更新等

所以我在谷歌上搜索并找到了 GetWindowText 函数。

我已经运行了这段代码:


    HWND foreground = GetForegroundWindow();
    char window_title[7];

    if (foreground)
    {
        GetWindowText(foreground,(LPWSTR)window_title,7);
    }



    auto output = strstr(window_title,"FiveM");

    printf("%d",output);

没有输出,一切都是 0,但是当我使用函数 GetWindowTextA() 时一切正常,所以我在谷歌上搜索了更多关于这个 getwindow 函数的信息,我发现了这个 sub-workflow 并且我看到了这个

#define GetWindowText GetWindowTextA


in a non-Unicode build,GetWindowText and GetWindowTextA are the same thing. [...]

而且我的构建是 unicode 所以这是我必须在最后添加 A 的问题,为什么,以及为什么当我使用 GetWindowTextW aka GetWindowText 获取窗口文本时,一个字符需要更多空间,我想是因为我的方法正确

    char window_title[7];

    if (foreground)
    {
        GetWindowTextW(foreground,7);
        
    }

我也很困惑为什么 strstr() 函数在将输出值打印到控制台时会增加 memory violation 而只是简单地读取它不会引发任何内存冲突

解决方法

GetWindowTextW 以 unicode 宽字符串的形式提供输出。请注意,您可能会超出数组的末尾,因为 nMaxCount 参数是字符数,而不是字节数。这将解释为什么您会看到内存冲突,因为 UTF-16 宽字符包含 2 个字节;您实际上是在告诉 GetWindowTextW 缓冲区可以容纳 14 个字节,而实际上它只有 7 个字节长。

您需要向它传递一个 wchar_t 数组,然后完全在宽字符串(例如 wcslen)中工作或从宽字符串转换为字符串,如下所示: C++ Convert string (or char*) to wstring (or wchar_t*)

您可以使用 MSVC ATL 方法 A2WW2A,但我建议尽可能使用 std::stringstd::wstring


当你在宽字符串上使用字符串方法时,它们行为不正常,因为宽字符串通常包含零作为编码的高字节,字符串方法将其解释为空终止符(例如,在十六进制内存视图中,您可能会看到一些东西像 48 00 45 00 4C 00 4C 00 4F 00 00 00 - 字符串方法将其解释为“H”)


如果您查看 GetWindowText 的声明,您会发现如下内容:

    #ifdef _UNICODE
        #define GetWindowText GetWindowTextW
    #else
        #define GetWindowText GetWindowTextA
    #endif

这解释了为什么在非 Unicode 构建中 GetWindowText 与 GetWindowTextA 相同


另一种可能是使用 GetWindowTextA 并使用字符串完成整个操作,但该选项可能对您不开放。

,

您在处理 Unicode(又名宽)和 ANSI(又名窄)字符串方面非常混乱。您应该选择一种变体并坚持下去。在这种情况下,由于您是为 Unicode 构建的,宽字符串是自然的选择。

所以,代码应该看起来像这样:

HWND foreground = GetForegroundWindow();

if (foreground)
{
    WCHAR window_title[256];
    GetWindowText(foreground,window_title,_countof (window_title));
    const WCHAR *output = wcsstr (window_title,L"FiveM");
    ... 
}

注意事项(排名不分先后):

  • 窗口标题肯定会超过 6 个字符,因此在检索时要留出足够的空间。

  • 为避免代码中出现“幻数”,请在适当的时候使用 _countof

  • strstr(或等价物,wcsstr)的返回类型是 char *(或 WCHAR *),而不是 int ,因此请相应处理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res