2011-08-13 24 views
1

我面臨一個非常奇怪的問題,無法弄清楚錯誤在哪裏。我使用SendMessage_EX來獲得指定行的文本:無法在我的c#程序中使用兩次SendMessage_EX

SendMessage_Ex(hr.Handle, EM_GETLINE, l, buffer); 

然後我調用該方法兩次這樣的:

StringBuilder buffer = new StringBuilder(256); 
SendMessage_Ex(hr.Handle, EM_GETLINE, 5, buffer); 
StringBuilder buffer1 = new StringBuilder(256); 
SendMessage_Ex(hr.Handle, EM_GETLINE, 4, buffer1); 

它得到第5行的文本正確,但隨後的4號線,它返回什麼都沒有(buffer1是空的)。 如果我把它倒過來,先得到第4行然後第5行,它將返回第4行的文本,並且第5行沒有任何內容。

這很奇怪,我確信我犯了一個簡單的錯誤,但是在哪裏是錯誤的? 我感謝任何幫助。 :)

+0

顯然,你忘了,包括SendMessage_Ex的身體()方法,所以我們可以看看它是如何讀取的緩衝區 – sll

+0

我能夠重現。 Windows API調用的原型是:[DllImport(「user32.dll」,EntryPoint =「SendMessageA」)] private static extern int SendMessage_Ex (IntPtr hwnd,int wMsg,int wParam,StringBuilder lParam); private const int EM_GETLINE = 0xc4; –

+0

感謝您的回覆,我已經使用了確切的dllimport並聲明瞭EM_GETLINE(我認爲這很明顯,所以我沒有提及有問題的代碼,對不起)但我不知道爲什麼我不能因此調用它。 :(任何想法? – Luke

回答

1

EM_GETLINE消息希望緩衝區的大小通過緩衝區使用相同的參數傳遞。我不能只設置StringBuilder的0索引而不將它初始化爲某個值(得到一個索引異常)。

這似乎工作:

StringBuilder buffer = new StringBuilder(" ", 256); 
buffer[0] = (char)256; 
int Result = SendMessage_Ex(textBox1.Handle, EM_GETLINE, 3, buffer); 

StringBuilder buffer1 = new StringBuilder(" ", 256); 
buffer1[0] = (char)256; 
int Result1 = SendMessage_Ex(textBox1.Handle, EM_GETLINE, 2, buffer1); 

MessageBox.Show(buffer.ToString()); 
MessageBox.Show(buffer1.ToString()); 
+1

非常感謝史蒂夫。你是天才,也拯救了我的一天! – Luke

相關問題