GetWindowText(C代码)替换字符\ uFFFD

时间:2013-06-12 10:07:03

标签: c string unicode

我正在为我的正在播放插件获取Spotify的窗口标题功能:

GetWindowText(spotify_window_handle, title, title_length)

但输出包含替换字符\ uFFFD。

Ex. Spotify - Killswitch Engage � One Last Sunset

如何用C替换 ?

完整代码:

char* spotify_title(int window_handle)
{
    int title_length = GetWindowTextLength(window_handle);
        if(title_length != 0)
        {
            char* title;
            title = (char*)malloc((++title_length) * sizeof *title );
            if(title != NULL)
            {
                GetWindowText(window_handle, title, title_length);
                if(strcmp(title, "Spotify") != 0)
            {
                return title;
            }
            else
            {
                return "Spotify is not playing anything right now. Type !botnext command to restart playback.";
            }
        }
        else
        {
            printf("PLUGIN: Unable to allocate memory for title\n");
        }
        free(title);
    }
    else
    {
        printf("PLUGIN: Unable to get Spotify window title\n");
    }
}
// End of Spotify get title function

3 个答案:

答案 0 :(得分:1)

在Unicode-> Ansi转换期间使用替换字符。在没有看到实际声明title的方式(是使用char还是wchar_t?)的情况下,我的猜测是你正在调用GetWindowText()的Ansi版本(又名{{1}窗口标题包含一个Unicode字符,无法在操作系统的默认Ansi语言环境中表示,因此在将窗口文本转换为Ansi进行输出时,GetWindowTextA()将替换该字符。请记住,Windows实际上是基于Unicode的操作系统,因此您应该使用Unicode版GetWindowTextA()(又名GetWindowText()),例如:

GetWindowTextW()

或者:

WCHAR title[256];
int title_length = 256;
GetWindowTextW(spotify_window_handle, title, title_length);

或者至少确保您的项目配置为针对Unicode进行编译,以便在编译期间定义int title_length = GetWindowTextLengthW(spotify_window_handle); LPWSTR title = (LPWSTR) malloc((title_length+1) * sizeof(WCHAR)); GetWindowTextW(spotify_window_handle, title, title_length+1); ... free(title); UNICODE。这会使_UNICODE映射到GetWindowText()而不是GetWindowTextW()。然后,您必须将GetWindowTextA()用于TCHAR缓冲区,例如:

title

或者:

TCHAR title[256];
int title_length = 256;
GetWindowText(spotify_window_handle, title, title_length);

答案 1 :(得分:0)

这取决于您是否使用Unicode。既然你说\ uFFFD你最有可能是Unicode

   WCHAR *wp; 

   while ((wp= wcschr(title, '\uFFFD'))!=NULL) {
       *wp= L'-';
   }

答案 2 :(得分:0)

假设字符串是wchar_t

的数组
wchar_t * p = wcschr(title, `\uFFFD`);
if (p)
  *p = `\u002D`;