编辑:工作代码发布在下面,非工作代码注释掉。必须使用与在Win7中创建数据时相同的字符从windows中检索数据。
我有一个用C编写的对话框,它在WinXP中工作得很好,但是在Win7中无法从unicode中的编辑控件收集用户输入。问题出现在第一次调用SendMessageW时,如下所示:
/* handles to controls */
HWND hDomainEdit;
HWND hOtherEdit;
HWND hTextOut;
HWND hButton;
/* buffers to receive input */
WCHAR wszDomain[256];
CHAR szOtherInput[512];
CHAR szBuffer[512]; //added to hold temporary value of wszDomain
/* a test string */
const CHAR szTest[] = "This is a test of SendMessageA."
BOOL dialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
if (message == WM_INIT) {
/* get all the handles shown above, then... */
SendMessageA(hTextOut, WM_SETTEXT, 0, (LPARAM) szTest);
/* worked fine */
/* do a few other things */
} else if (message == WM_COMMAND) {
/* are some other conditions are true? they sure are */
/* time to collect a bunch of input from controls */
int cchResultLen = (int) SendMessageA(hOtherEdit, WM_GETTEXT, 512, (LPARAM) szOtherInput);
/* cchResultLen is correctly the length of the user input */
/* cchResultLen = (int) SendMessageW(hDomainEdit, WM_GETTEXT, 256, (LPARAM) wszDomain); */
/* begin new code */
cchResultLen = (int) SendMessageA(hDomainEdit, WM_GETTEXT, 512, (LPARAM) szBuffer);
cchResultLen = MultiByteToWideChar(CP_UTF8, 0, szBuffer, cchResultLen, wszDomain, 256);
wszDomain[cchResultLen] = 0; /* above doesn't terminate string */
/* after SendMessageW(), cchResultLen was 0, no string transferred, no error
message. using SendMessageA, all is well. */
}
}
SendMessageA似乎在message=WMúGETTEXT或WM戋SETTEXT下工作多次,突然,当需要宽字符串时,SendMessageW失败。现在,我知道每个人都认为应该选择一个字符并始终使用SendMessage,但事实并非如此;Win32.hlp明确指出,通过手动调用各个函数,可以在同一程序中同时使用这两个字符。我确信其他人已经准备好说控件本身已经或将被提交到一个特定的字符上,但在WinXP中情况并非如此,在WinXP中这一点非常有效。特定的编辑控件也永远不会显式设置为ASCII字符串。
该程序与WinHttp交互,WinHttp需要所有WCHAR字符串,这就是SendMessageW的来源。其余的输入只在内部使用,主要是解析带有单位标签的整数,如果不是因为程序最初是这样写的,那么在ASCII中更方便和有效。
那怎么办?他们真的把像SendMessage这样完整的东西改成不兼容了吗?如果是,这是一个已知的有解决方法的bug,还是随意切换字符的能力是一个不推荐的特性?在使用SendMessageA获取输入后,是否还有其他比手动将其扩展到WCHAR更简单的方法?
最佳答案
我的理解是,如果您使用调试器逐步检查代码,您将看到原因。
首先,你有一个接一个的两个发送消息,它们使用不同的窗口句柄,所以它们不能给你相同的结果。我们来谈谈给你带来问题的那个:
cchResultLen = (int) SendMessageW(hDomainEdit, WM_GETTEXT, 256, (LPARAM) wszDomain);
// cchResultLen is ZERO! wszDomain[0] is null. Edit control is not empty
在这一行使用调试器,检查hDomainEdit变量。可能它是无效的,比如NULL或被其他代码损坏。这将解释无效句柄和零结果。
关于c - 从WinXP迁移Win7中的SendMessageA和SendMessageW,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7428114/