EDIT : 아래에 게시 된 작업 코드는 작업 코드가 주석 처리되었습니다. Win7에서 창을 생성 할 때 사용했던 창에서 데이터를 가져 오는 데 동일한 CHAR_T를 사용해야합니다.WinXP에서 SendMessageA 및 SendMessageW가 WinXP에서 마이그레이션되었습니다.
WinXP에서 완벽하게 작동하지만 Win7에서 유니 코드의 편집 컨트롤에서 사용자 입력을 수집하지 못하는 대화 상자가 C로 작성되었습니다. 아래 그림과 같이 문제는 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. */
}
}
SendMessageW 대신 메시지 = WM_GETTEXT 또는 WM_SETTEXT, 넓은 문자열이 필요한 경우 갑자기, SendMessageW이 실패로 여러 번 작동이 나타납니다. 이제, 모든 사람들이 당신이 CHAR_T를 고르고 항상 SendMessage를 사용하여 고수해야한다고 생각하고 있습니다. Win32.hlp 명시 적으로 개별 프로그램을 수동으로 호출하여 같은 프로그램에서 둘 다 사용할 수 있습니다. 다른 사람이 컨트롤 자체가 하나의 특정 CHAR_T에 대해 커밋되거나 커밋 된 상태라고 말할 준비가되었지만 이것이 완벽하게 작동하는 WinXP에서는 그렇지 않습니다. 이 특정 편집 컨트롤도 ASCII 문자열로 명시 적으로 설정되지 않습니다.
이 프로그램은 모든 WCHAR 문자열을 필요로하는 WinHttp와 상호 작용하며 SendMessageW가 오는 곳입니다. 나머지 입력은 내부적으로 만 사용되며 주로 ASCII로 더 편리하고 효율적인 단위 라벨이있는 구문 분석 된 정수입니다 , 그 이유는 프로그램이 원래 그렇게 쓰여졌 기 때문 만은 아닙니다.
그럼 어떻게해야합니까? 그들은 실제로 SendMessage와 같이 필수적인 것을 호환되지 않는 것으로 변경 시켰습니까? 그렇다면, 알려진 버그일까요? 아니면 사용하지 않는 기능으로 CHAR_T를 전환 할 수 있습니까? SendMessageA로 가져온 후에 수동으로 입력을 WCHAR로 확장하는 것보다 쉬운 방법이 있습니까?
오류가'SendMessageW()'에 없다고 생각합니다. 적어도 출발점으로. 'hDomainEdit'이 유효합니까? 'SendMessageA'를 쓸 때 어떻게됩니까? 또한'GetWindowText [AW]'를 사용하지 않으시겠습니까? – atzz
sayeth MSDN : "대상 창을 현재 프로세스가 소유하고 있으면 GetWindowText가 WM_GETTEXT 메시지를 지정된 창이나 컨트롤로 보냅니다." 그래서 그것은 거의 같은 효과를 가져야합니다. 나는 핸들의 가치를 확인하려고 노력할 것입니다 - 그것은 한 문장의 외부에서 결코 사용되지 않기 때문에, 다른 문제는 침묵 할 것입니다. 그것은 XP에서 올바른 컨트롤에 대한 올바른 핸들입니다. – sqykly
여기에 WM_GETTEXT를 사용하는 것이 잘못되었다고 말하는 것은 아닙니다. 개인적으로는 API 함수를 메시지에 사용하는 편이 더 좋을 것입니다. 또한 MSDN은 GetWindowText가 WM_GETTEXT를 보내는 것 외에 다른 작업을 수행하는지 여부를 나타내지 않습니다. 예 : 약간의 뉘앙스가있을 수 있습니다.ANSI/UNICODE 변환 (기억이 안나지만). – atzz