Вот что я успешно использовал для этой цели с удаленной / отключенной проверкой ошибок GetLastError:
[DllImport("user32.dll", SetLastError = false)]
public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam);
public const uint WM_SETTEXT = 0x000C;
private void InteropSetText(IntPtr iptrHWndDialog, int iControlID, string strTextToSet)
{
IntPtr iptrHWndControl = GetDlgItem(iptrHWndDialog, iControlID);
HandleRef hrefHWndTarget = new HandleRef(null, iptrHWndControl);
SendMessage(hrefHWndTarget, WM_SETTEXT, IntPtr.Zero, strTextToSet);
}
Я проверил этот код, и он работает, поэтому, если он не работает, вы должны быть уверены, что используете правильный дескриптор окна (дескриптор самого диалогового окна) и правильный идентификатор элемента управления. Также попробуйте что-нибудь простое, например, редактирование диалогового окна «Найти» в Блокноте.
Я пока не могу комментировать в сообщении об использовании (char *), но это не обязательно. См. Вторую перегрузку C # в p / Invoke SendMessage . Вы можете передать String или StringBuilder непосредственно в SendMessage.
Я также отмечаю, что вы говорите, что ваш контрольный идентификатор - 114. Вы уверены, что WinSpector дал вам это значение в базе 10? Потому что вы подаете его в GetDlgItem как базовый номер 10. Я использую Spy ++ для этого, и он возвращает идентификаторы управления в базе 16. В этом случае вы должны использовать:
IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114);