2016-11-22 80 views
-2

所以基本上我是從文本字段中試圖獲取文本編輯控件獲取文本,因爲我知道你從GetWindowText時得到指針是嗎?我不能將該文本放置在長字符中,所以我不得不使用int和消息框來取整數,所以我必須轉換成長字符,然後反轉指針(&)?顯示在消息框中的文本和剛剛打印我一串無義的使用WinAPI的

情況WM_CREATE:

textbox1 = CreateWindow(L"EDIT", 
      L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE, 
      50, 120, 50, 20, 
      hwnd, NULL, NULL, NULL); 

情況WM_COMMAND:

case 111:{   
TCHAR buff[1024]; 
int text = GetWindowText(textbox1, buff, 1024); 
TCHAR textS = (TCHAR)text; 
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);} 
+1

刪除'TCHAR文本= (TCHAR)文本;'只使用'buff'。 –

+0

[來自MSDN](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v = vs.85).aspx):「如果函數成功,返回值是長度,以字符形式複製的字符串,不包括終止空字符。「你在哪裏看到「你從GetWindowText得到指針」? – andlabs

+0

哦,我用其他方式使用這個函數,因爲理查德說我只是需要打印「buff」,這對我來說是意想不到的,現在一切都變得有意義 – sanxe

回答

1

GetWindowText()的返回值是長度複製的文本(不包括空終止符)。您將該值類型轉換爲單個TCHAR字符,然後將該單個字符的內存地址傳遞給MessageBox()。這顯然是錯誤的。 MessageBox()需要一個指向空結尾的字符串,所以你應該改爲通過你的複製TCHAR[]緩衝:或者

TCHAR buff[1024] = {0}; 
GetWindowText(textbox1, buff, 1024); 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 

,改爲使用動態分配的緩衝區:

int len = GetWindowTextLength(textbox1) + 1; 
TCHAR *buff = new TCHAR[len]; 
len = GetWindowText(textbox1, buff, len); 
buff[len] = 0; 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] buff; 
1

使用(wchar_t的/ TCHAR)緩衝液:

int cTextLength; // text length 
cTextLength = GetWindowTextLength(hWndEdit);// get text length 
wchar_t * textS = new wchar_t[cTextLength + 1]; //dynamically allocate buffer 
// get text from an edit and store it into a buffer variable 
GetWindowText(hWndEdit, textS, cTextLength + 1); 
// display the message 
MessageBox(NULL, textS, textS, MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] textS; // free the allocated memory 
+0

'GetWindowTextLength()'返回一個'int',而不是'size_t'。如果文本大於1023個字符,此代碼將溢出緩衝區。如果你打算使用'GetWindowTextLength()',那麼要麼根據報告的實際長度動態分配'textS',要麼至少使用'min()'將'cTextLength'的值限制爲1023 max。 –

+0

你是雷米吧。我已根據您的指示更新了答案。我不確定它應該是'new wchar_t [cTextLength];'還是'new wchar_t [cTextLength + 1];'? – 2016-11-22 21:52:30

+0

'GetWindowTextLength()'返回的長度不包括空終止符,但是傳遞給'GetWindowText()'的大小確實如此,因此分配'cTextLength'字符然後傳遞'cTextLength + 1'是錯誤的。另外不要忘記你分配的內存空間。 –