2010-08-03 61 views
1

我创建了一个多行编辑控件一个简单的窗口:WinAPI的 - 问题将文本追加到一个编辑框

Edit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), NULL, 
        WS_CHILD | WS_VISIBLE | ES_MULTILINE, 
        20, 200, 200, 200, 
        hWnd, (HMENU)EDIT, GetModuleHandle(NULL), NULL); 

如果我使用WM_SETTEXT消息,我没有得到errorrs设置文本,但如果我用EM_REPLACESEL 我得到错误5(ERROR_ACCESS_DENIED):

SendMessage(GetDlgItem(hWnd, EDIT), EM_REPLACESEL, 0, (LPARAM)TEXT("\r\nSome text")); 
if (GetLastError()) { 
    /* Error 5 ERROR_ACCESS_DENIED */ 
} 

同样的问题EM_SETSEL:

SendMessage(GetDlgItem(hWnd, EDIT), EM_SETSEL, (WPARAM)(0),(LPARAM)(-1)); 
SendMessage(GetDlgItem(hWnd, EDIT), EM_REPLACESEL, 0, (LPARAM)TEXT("\r\nSome text")); 
if (GetLastError()) { 
    /* Error 5 ERROR_ACCESS_DENIED */ 
} 

我注意到,如果我在EM_REPLACESEL之前发送WM_SETFOCUS消息没有错误:

SendMessage(GetDlgItem(hWnd, EDIT), WM_SETFOCUS, (WPARAM)GetDlgItem(hWnd, EDIT), 0); 
SendMessage(GetDlgItem(hWnd, EDIT), EM_REPLACESEL, 0, (LPARAM)TEXT("\r\nSome text")); 
if (GetLastError()) { 
    /* NO ERRORS */ 
} 

我怎样才能解决这个问题呢? 每次我想将一些文本附加到我的Editbox时,是否必须在EM_REPLACESEL之前发送WM_SETFOCUS消息?

感谢您的帮助!

+0

如果你只是'SetLastError(0)'发送'EM_REPLACESEL'消息之前? – 2011-01-21 22:14:35

回答

1

您可以先简单地使用EM_SETSEL,然后再做EM_REPLACESEL

例子:

SendMessage(hwnd, EM_SETSEL, WPARAM(0), LPARAM(-1)); 
SendMessage(hwnd, EM_REPLACESEL, WPARAM(TRUE), LPARAM(str)); 
+0

我有使用EM_SETSEL相同的问题,并且我得到错误5 – Mario 2010-08-03 11:44:19

+0

@Mario,如果你得到错误5(拒绝访问),这意味着你没有适当的权利。 – Abel 2010-08-03 12:03:18

0

你最有可能获得访问被拒绝,因为UIPI的。

编辑框是否由尝试发送消息的相同应用程序创建?否则,执行SendMessage的应用程序的UIPI级别可能会低于拥有编辑的应用程序。

如果您确实拥有创建编辑控件的应用程序和发送消息的应用程序,则可以通过使用ChangeWindowMessageFilterEx来允许特定的消息。

ChangeWindowMessageFilterEx(hwndOfWindowReceivingMessage, EM_REPLACESEL, 
    MSGFLT_ALLOW, NULL); 
+0

是的编辑框是由同一个应用程序创建的。我也在EM_REPLACESEL之前尝试过你的代码: ChangeWindowMessageFilterEx(GetDlgItem(hWnd,EDIT),EM_REPLACESEL,MSGFLT_ALLOW,NULL); 但我得到同样的错误。 – Mario 2010-08-03 13:00:08

+0

你可以检查ChangeWindowMessageFilterEx是否成功吗?如果不是,那么错误代码是什么? – 2010-08-03 13:08:58

+0

ChangeWindowMessageFilterEx成功, 但是,由于Edit控件是由同一个应用程序创建的,我必须在任何情况下都调用ChangeWindowMessageFilterEx吗? – Mario 2010-08-03 13:13:03

0

不幸的是作为支持EM_REPLACESEL意味着你必须设计捕捉失败一些备选策略GetLastError函数未记录。也许一些文本长度计算可以工作。

话虽如此,我很好奇为什么访问被拒绝的错误被返回。我在SetLastError/GetLastError存储错误代码的地址上设置了一个数据中断点,发现它位于GDI深处,而不是直接来自编辑控件。不是很有帮助,但至少有一个有趣的消息。

0

您可能需要使用SendDlgItemMessage而不是SendMessage。

0

请注意,EM_SETSEL,EM_REPLACESEL等作用于插入符;如果焦点不在控件上,它没有脱字符,并且这些消息不起作用。您的用户必须点击该控件才能获得焦点,否则必须先执行WM_SETFOCUS。不幸的是,这就是控制的工作原理,在失去焦点之后没有选择记忆(在获得它之前都没有选择)。

0

试试这个

wchar_t buffer[256] = _T("here I am at camp granada \r\n"); 
int ndx = GetWindowTextLength (hEdit); 
SetFocus (hEdit); 
SendMessage(hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx); 
SendMessage(hEdit, EM_REPLACESEL, WPARAM(TRUE), (LPARAM)buffer); 
相关问题