C++ 如何在C+中使用FindWindow在unicode中搜索+;

C++ 如何在C+中使用FindWindow在unicode中搜索+;,c++,unicode,C++,Unicode,在使用FindWindowW(NULL,“程序名”)函数时,我一直在寻找中文程序名 当我搜索英语时,它非常有效 有人能给我一个关于如何使用unicode进行搜索的线索吗 我还不明白,有人能指导我怎么做吗 #include <windows.h> #include <stdio.h> int main(){ HWND hWnd = FindWindowW(NULL,L"\uAA5A\uAA4C\uB873\uAB4C\uB6C7"); if(NULL =

在使用
FindWindowW(NULL,“程序名”)
函数时,我一直在寻找中文程序名

当我搜索英语时,它非常有效

有人能给我一个关于如何使用unicode进行搜索的线索吗

我还不明白,有人能指导我怎么做吗

#include <windows.h>
#include <stdio.h>

int main(){
    HWND hWnd = FindWindowW(NULL,L"\uAA5A\uAA4C\uB873\uAB4C\uB6C7");

    if(NULL == hWnd){
        printf("NotFound!");
    }else {
        printf("Found!");
    }
   }
#包括
#包括
int main(){
HWND HWND=FindWindowW(NULL,L“\uAA5A\uAA4C\uB873\uAB4C\uB6C7”);
if(NULL==hWnd){
printf(“未找到!”);
}否则{
printf(“找到了!”);
}
}
使用FindWindow的Unicode(宽)版本,并使用宽字符串进行搜索。我还建议将源代码保存为UTF-8编码,并使用Microsoft编译器的
/UTF-8
编译器开关;否则,编译器将采用本地化的ANSI编码来解释宽字符串。如果您使用的本地化编码是中文变体,那么这很好,但是如果您使用的是美国或西欧版本的Windows,如果您在字符串常量中使用中文字符,则Microsoft IDE可能会提示您保存为UTF-16:

例如:

#include <windows.h>
#include <stdio.h>

int main(void)
{
    //HWND h = FindWindowW(NULL,L"马克"); // works if saved in UTF-8 encoding
    //                                    // and compiled with /utf-8.

    HWND h = FindWindowW(NULL,L"\u9a6c\u514b");

    if(h == NULL)
        printf("err = %ld\n",GetLastError());
    else
        printf("handle = %p\n",h);
}
Microsoft的Spy++工具确认了句柄:

FindWindowW
…在构建程序时,是否定义了
UNICODE
宏?这将导致
FindWindow
“调用”成为对的调用。但是不要忘记使用宽字符串,比如在
L“program name”
(或者像
TEXT(“program name”)
这样的Windows宏之一)中,即使使用这个简单的程序#include#include#include#include#int main(void){setmode(_fileno(stdout),_U16TEXT);wprintf(L“test\n\x263a”)}我无法正确地打印出笑脸。。。顺便问一下,我使用代码块,这有关系吗?@nelLuffy这是一个完全不同的问题,与FindWindow问题无关。@nelLuffy您的简单程序是正确的。您只需要一个支持字符的终端字体。您会发现,如果将输出(可能是一个正方形)剪切并粘贴到记事本中,它将是正确的字符。我确实尝试过此操作,第一次尝试使用\x unicode时,它被找到了,但之后我再次尝试,它总是找不到,hwnd==null@nelLuffy使用您尝试的示例代码更新您的问题。我用一个完整的例子更新了答案。很抱歉,我发现问题是我的计算机区域设置,我需要更改为台湾(传统),以便软件能够正确显示程序名,然后我将能够通过Unicode进行搜索,如果我改回英语或其他甚至中国(简化),它将无法找到使用Unicode的软件。这是无法通过的限制还是您有解决方案?@nelLuffy wide API与区域设置无关。您是否在所有调用中都使用宽API?这听起来可能很愚蠢,但什么是宽API,我用代码编辑了这个问题,但只将区域设置更改为台湾(传统)。
C:\>title 马克

C:\>test
handle = 00000000000B0258

C:\>test
handle = 00000000000B0258