IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Delphi: sendmessage не работает (https://www.imho.ws/showthread.php?t=92321)

delphist 09.09.2005 12:32

Delphi: sendmessage не работает
 
Код
h:=findwindow(nil, pchar(edit1.text));
sendmessage(h, wm_close, 0, 0);
пашет нормально, но другие сообщения
sendmessage(h, WM_NEXTDLGCTL, 0, 0);
sendmessage(h, WM_PASTE, 0, 0);
не оказывают влияния на получателя.

Что я делаю неправильно?

dyr_farot 09.09.2005 14:29

первое ты шлеш не тому контролу -- нужно его родителю.
насчет второго... у тебя формат данных какой? должен быть CF_TEXT

delphist 09.09.2005 16:02

то есть родителю? я получаю дескриптор окна и пытаюсь вставить в активный компонент. нифига не вставляется не в формате дело. Может нада дописать wm_paste, x, y?

dyr_farot 09.09.2005 16:11

Цитата:

The WM_NEXTDLGCTL message is sent to a dialog box procedure to set the keyboard focus to a different control in the dialog box.
т.е. это сообщение нужно слать не едит-у а его родителю

Цитата:

WM_PASTE
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
так что координаты слать не нужно

/7y3uK 09.09.2005 21:28

А можно вопрос? Нафига такие извраты?

delphist 20.09.2005 18:40

Цитата:

dyr_farot:
это сообщение нужно слать не едит-у а его родителю
так я родителю и шлю
Цитата:

dyr_farot:
координаты слать не нужно
я имел в виду не координаты, а какие-либо параметры, которые я итак выставляю в ноль.
Так че делать?

dyr_farot 20.09.2005 18:44

у тебя что в sendmessage(h, WM_NEXTDLGCTL, 0, 0) что в sendmessage(h, WM_PASTE, 0, 0) одинаковые хэндлы ( по приведенному коду )
получается что ты или и текст шлеш родителю или пытаешся заставить edit сменить контрол

delphist 21.09.2005 13:49

Так я сначала меняю контрол на текстовый (т.к. знаю, что следующий будит текстовым типа TMemo), а потом пытаюсь вставить в него текст.

dyr_farot 21.09.2005 13:56

"сначала" это когда? и как ты его меняеш?
давай по-порядку: ты нашел окно. что потом?

delphist 21.09.2005 18:17

Цитата:

dyr_farot:
по-порядку:
1. копирую необходимый текст (простой)
2. запускаю свою прогу, и ту, в которую нужно вставить текст
3. нажимаю в своей проге "Поехали!" с кодом:

h:=findwindow(nil, pchar(edWindowHeader.text)); //ищу по тексту из едита
sendmessage(h, WM_NEXTDLGCTL, 0, 0);
sendmessage(h, WM_NEXTDLGCTL, 0, 0); (*знаю, что текстовый компонент третий по порядку*)
sendmessage(h, WM_PASTE, 0, 0); //вставка из буфера

Прикол в том, что ничего не происходит, но если в этой же проге (чужой) нажать два раза TAB, то активным будет текстовый компонент

dyr_farot 21.09.2005 18:25

в коде куча ошибок.
первая:
Цитата:

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.
т.е. edit ты в принципе найти не можеш. сначала нужно найти окно, в котором лежит этот edit, а уже потом искать в его дочерних окнах этот edit.
вторая:
h:=findwindow(nil, pchar(edWindowHeader.text));
sendmessage(h, WM_NEXTDLGCTL, 0, 0);
эти кодом ( если предположить что он работает и h -- HANDLE edit' a ) ты просиш edit переключить фокус на следующий из своих контролов ( о чем я и говорил ) что не правильно -- нет у него никаких контролов.

delphist 21.09.2005 18:47

Цитата:

dyr_farot:
искать в его дочерних окнах
edit не в дочернем окне, а в главном
Цитата:

dyr_farot:
ты просиш edit переключить фокус на следующий из своих контролов
поясню строчку
Цитата:

dyr_farot:
h:=findwindow(nil, pchar(edWindowHeader.text));
я не знаю имя класса окна (и оно мне не нада), поэтому ставлю его в nil,
в этом случае поиск чужого окна произвожу по имени окна, которое для гибкости беру из своего edit.text, в итоге получаю что-то вроде:
h:=findwindow(nil, 'Безымянный - Блокнот');
причем h<>0 (при выполнении проги).

dyr_farot 21.09.2005 18:53

Цитата:

edit не в дочернем окне, а в главном
никто и не спорит. но edit не является top-level window. edit -- дочеренее окно другого окна ( формы )

Цитата:

я не знаю имя класса окна (и оно мне не нада), поэтому ставлю его в nil,
в этом случае поиск чужого окна произвожу по имени окна, которое для гибкости беру из своего edit.text, в итоге получаю что-то вроде:
h:=findwindow(nil, 'Безымянный - Блокнот');
причем h<>0 (при выполнении проги).
т.е. ты ищеш не edit, а окно, его содержащее?
тогда этой:
sendmessage(h, WM_PASTE, 0, 0);
строкой ты вставляеш текст в найденное тобой окно ( а не в edit )

delphist 21.09.2005 18:58

Цитата:

dyr_farot:
строкой ты вставляеш текст в найденное тобой окно ( а не в edit )
а в этом случае не происходит вставки в активный компонент?
а как сделать?

dyr_farot 21.09.2005 19:03

нет. сообщение идет по адресу, а адрес -- handle окна.

что делать?..
можеш юзать:
Код:

HWND FindWindowEx(
    HWND hwndParent,        // handle to parent window
    HWND hwndChildAfter,        // handle to a child window
    LPCTSTR lpszClass,        // pointer to class name
    LPCTSTR lpszWindow        // pointer to window name
  );

передав первым параметром h, а вторым NULL.


Часовой пояс GMT +4, время: 19:10.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.