![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WM_GETTEXT окну чужого процесса
Atheist © (2006-01-20 17:21:00)Здравствуйте!
В ВинАпи я пока новичок, поэтому прошу вашего совета. Подскажите, куда копать или что читать.
Ситуация: есть чужое приложение. В нем контрол, комбобокс. Я определяю хэндл edit'а этого комбобокса, посылаю ему WM_GETTEXT. Возвращается пустая строка. А всякими шпионами все ловится отлично.
В каких случаях такое может быть?
Atheist (2006-01-20 21:47:00) [1]Ничего статья, только она для родных контролов
Джо (2006-01-20 20:00:00) [2]На всякий случай держи статью по этому вопросу.
http://dotnet.sys-con.com/read/39039.htm
Статья How to Subclass in .NET.
Джо (2006-01-20 19:53:00) [3]Попробуй сформулировать задачу в конференции по .Net (подмена оконной процедуры своим методом). Сдается мне, не так все просто там.
Leonid Troyanovsky (2006-01-20 19:42:00) [4]
> Atheist (20.01.06 19:27) [18]
> А это оконка:
>
> private int NameBarWndProc(IntPtr hWnd, int Msg, int
> wParam, int lParam)
Я в диезе профан, но, по аналогии, кажется мне, что NameBarWndProc д.б.
обычной процедурой, а не методом.
А как организовать сию модель я не знаю, бо Рихтера читал весьма давно.
Т.е., я пока сильно сомневаюсь в работоспособности оного, даже
без case (можно опустить).
А проверить мое предположение можно из отдельно стоящего
приложения, которое пошлет честный WM_GETTEXT в злосчастный
контрол, о результатах чего я рассчитываю узнать в понедельник,
бо настала пора отходить на заранее определенные позиции.
--
Regards, LVT.
Atheist (2006-01-20 19:27:00) [5]>Код давай, хоть на VBA.
>И пальцем ткни, где Excel оный комбо.
Минуточку.
Что это Комбо, показал Спай++.
this.nameBarControlHwnd = (System.IntPtr) FindWindowEx(this.excelApplication.Hwnd, 0, "EXCEL;", null);
this.nameBarComboHwnd = (System.IntPtr) FindWindowEx(this.nameBarControlHwnd.ToInt32(), 0, "combobox", null);
this.nameBarEditHwnd = (System.IntPtr) FindWindowEx(this.nameBarComboHwnd.ToInt32(), 0, "edit", null);
А это оконка:
private int NameBarWndProc(IntPtr hWnd, int Msg, int wParam, int lParam)
{
switch (Msg)
{
case (int) Win32.Msg.WM_KEYDOWN:
MessageBox.Show(String.Format("Name Bar Key Down event fired. Key - {0}", wParam));
break;
default:
break;
}
return CallWindowProc(this.oldNameBarWndProc, hWnd, Msg, wParam, lParam);
}
Leonid Troyanovsky (2006-01-20 19:14:00) [6]
> Atheist (20.01.06 18:55) [15]
> Класс ComboBox
Ввв..
IsWindowUnicode?
--
Regards, LVT.
Leonid Troyanovsky (2006-01-20 19:06:00) [7]
> Atheist (20.01.06 18:55) [15]
> >Он возвращает 0? Кста, а какой класс у этого комбо?
> >звращает он (не Edit), например, правильный CB_GETCOUNT?
> Класс ComboBox
Код давай, хоть на VBA.
И пальцем ткни, где Excel оный комбо.
--
Regards, LVT.
Atheist (2006-01-20 18:55:00) [8]>Он возвращает 0? Кста, а какой класс у этого комбо?
>звращает он (не Edit), например, правильный CB_GETCOUNT?
Класс ComboBox
Leonid Troyanovsky (2006-01-20 18:47:00) [9]
> Atheist (20.01.06 18:43) [13]
> >SendMessage vs PostMessage?
> Делаю Сенд.
Он возвращает 0? Кста, а какой класс у этого комбо?
Возвращает он (не Edit), например, правильный CB_GETCOUNT?
--
Regards, LVT.
Atheist (2006-01-20 18:43:00) [10]>Если старую вызываешь то, в принципе, должно быть нормально.
Было бы нормально, я не задавал бы тут вопроса :)
Atheist (2006-01-20 18:43:00) [11]>SendMessage vs PostMessage?
Делаю Сенд.
Leonid Troyanovsky (2006-01-20 18:41:00) [12]
> Atheist (20.01.06 17:38) [4]
> дела. Или просто обычной вещи, о которой везде неписано,
> а я не видел...
SendMessage vs PostMessage?
--
Regards, LVT.
Джо (2006-01-20 18:38:00) [13]> [9] Atheist (20.01.06 17:50)
Если старую вызываешь то, в принципе, должно быть нормально.
Atheist (2006-01-20 17:50:00) [14]>Вот так фунт. Ну, тогда ты сам ответственен за обработку всех сообщений, >в том числе и WM_GETTEXT.
Так, вот тут я почувствовал себя неуверенно. Как это? Я же вызываю родимую процедуру.
Интересно... Может, моя проца мешает отработать той?
Atheist (2006-01-20 17:46:00) [15]>Надеюсь, старая оконная функция из неё, когда нужно, вызывается?
Разумеется, после каждой обработки, в самом конце моей подменки-процедуры.
Джо (2006-01-20 17:45:00) [16]> [4] Atheist (20.01.06 17:38)
> Всем по-порядку.
>
> Ситуация подробнее. Написал некий add-in для Excel, и нужно
> кое-что сделать с name bar.
> Поверьте, хэндл определили правильно - проверено отладчиком
> и шпионом.
> Далее, подменяю оконную процедуру хэндла своей, путем SetWindowLong
> Перехватываю WM_KEYDOWN. Без проблем, ловится. (это все
> из моей dll)
Вот так фунт. Ну, тогда ты сам ответственен за обработку всех сообщений, в том числе и WM_GETTEXT.
begin...end (2006-01-20 17:42:00) [17]> Atheist (20.01.06 17:38) [4]
> Далее, подменяю оконную процедуру хэндла своей, путем SetWindowLong
Надеюсь, старая оконная функция из неё, когда нужно, вызывается?
Athiest (2006-01-20 17:42:00) [18]>Вроде как можно послать сообщение самому combobox'у
Да, это я от отчаяния начал копаться. С комбобоксом та же история.
Atheist (2006-01-20 17:38:00) [19]Всем по-порядку.
Ситуация подробнее. Написал некий add-in для Excel, и нужно кое-что сделать с name bar.
Поверьте, хэндл определили правильно - проверено отладчиком и шпионом.
Далее, подменяю оконную процедуру хэндла своей, путем SetWindowLong
Перехватываю WM_KEYDOWN. Без проблем, ловится. (это все из моей dll)
И вот после определения кода нажатой клавиши (определяю верно), мне нужно взять полный текст из name bar. Из своей оконной процедуры, из той части, что обрабатывает WM_KEYDOWN, посылаю WM_GETTEXT - пусто.
Код могу привести, он он отрабатывает во всем как надо, кроме этого случаю, и он C#.
Скорее всего, не знаю каких-то тонкостей обработки этого дела. Или просто обычной вещи, о которой везде неписано, а я не видел...
begin...end (2006-01-20 17:29:00) [20]> Atheist (20.01.06 17:21)
> Я определяю хэндл edit'а этого комбобокса, посылаю ему WM_GETTEXT.
Вроде как можно послать сообщение самому combobox'у: For a combo box, the text is the content of the edit control (or static-text) portion of the combo box.
> В каких случаях такое может быть?
В случае неверного хэндла, например.