2013-02-26 3 views
0

Когда я пытаюсь вставить текст в текстовое поле другой программы, текст вставляется, но программа не распознает его.Вставка текста с помощью SendMessage

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 
const uint WM_SETTEXT = 0x000C; 

IntPtr text = Marshal.StringToCoTaskMemUni("100"); 
IntPtr thisWindow = FindWindow(null, "AnotherWindow"); 
IntPtr handle = FindWindowEx(thisWindow, IntPtr.Zero, "AnotherTextBox", null); 
SendMessage(handle, WM_SETTEXT, IntPtr.Zero, text); 
Marshal.FreeCoTaskMem(text); 

Возможно, мне следует отправить родительскому сообщению сообщение о том, что текстовое поле обновлено? Как это:

//Wrong code, because I do not know how correctly send a message 
SendMessage(handle, WM_COMMAND, EM_SETMODIFY, handle); 
+1

Используйте 'System.Windows.Automation', в частности, [' ValuePattern.SetValue'] (http://msdn.microsoft. ком/EN-US/библиотека/ms750582.aspx). –

+0

Microsoft UI Automation доступна в WPF, я использую Windows.Forms. – streamdown

+0

Вы можете использовать автоматизацию пользовательского интерфейса из программы Forms. Черт, я использовал его из консоли. –

ответ

1

И снова ... помощь пришла с другого сайта

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 
//... 
IntPtr boo = new IntPtr(1); 
SendMessage(handle, EM_SETMODIFY, boo, IntPtr.Zero); 
0

Вы смотрели бы сделать что-то вроде:

PostMessage(GetParent(handle), WM_COMMAND, MAKEWPARAM(GetWindowLong(handle, GWL_ID), EN_CHANGE), (LPARAM)handle); 
+0

Я пробую вот так: const int GWL_ID = -12; const int EN_CHANGE = 0x0300; PostMessage (thisWindow, WM_COMMAND, MAKEWPARAM (GetWindowLong (thisWindow, GWL_ID), EN_CHANGE), 0); static int MAKEWPARAM (int loWord, int hiWord) { return (loWord & 0xFFFF) + ((hiWord & 0xFFFF) << 16); } Это ничего. Tex еще не обработан. – streamdown

0

некоторые Textboxes уже были чтобы вы не могли сразу установить текст WM_SETTEXT, особенно те, которые принимают цифры и выполняют вычисления в соответствии с этими цифрами. У меня была схожая проблема и она была решена с помощью кода. Я применил WM_PASTE, EM_REPLACESEL, чтобы завоевать это.

SendMessage(child, WM_SETFOCUS,0 , IntPtr.Zero); // go to text box 
System.Windows.Forms.Clipboard.SetText("1"); // set something in clipboard. it does not matter what it is. 
SendMessage(child, WM_PASTE, 0, IntPtr.Zero); // paste to get control of text box 
SendMessage(child, WM_SETTEXT, IntPtr.Zero, string.Empty); // clear textbox to insert your desired text. 
SendMessage(child, EM_REPLACESEL, IntPtr.Zero, "your text"); // insert your desired text. i inserted digits as text. 

вам необходимо импортировать файл user32.dll на первый:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    private static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    private static extern int SendMessage(IntPtr hWnd, uint msg,int wParam, IntPtr lParam); 
Смежные вопросы