Вопрос № 44075: Здравствуйте, эксперты! Интересует вопрос: можно ли в качестве WindowProc использовать функцию-член класса? Причем желательно не статичекую. Я как не пытался, так и не удалось прикрутить.
Зарание спасибо....Вопрос № 44135: Здравствуйте товарисчи Эксперты. Вопрос мой наверно уже задавался ни раз, но все мои попытки найти на него ответ не увенчался успехом... так вот:
1.Предположим что есть некая програма у которой в которой на главном окне висит компонент Edit. Я на...Вопрос № 44152: Как программно, с помощью функций WinAPI изменить имя компьютера и рабочей группы? Заранее благодарен....
Вопрос № 44.075
Здравствуйте, эксперты! Интересует вопрос: можно ли в качестве WindowProc использовать функцию-член класса? Причем желательно не статичекую. Я как не пытался, так и не удалось прикрутить.
Зарание спасибо.
Отправлен: 24.05.2006, 10:33
Вопрос задал: Sn8p (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Morgion
Здравствуйте, Sn8p!
Хороший вопрос!
Сам давно долго бился, пока не понял, почему не работает.
Для ф-и класса есть скрытый параметр this, поэтому нельзя эту ф-ю просто вызвать- нужен объект.
Выход- в ф-й обработки сообщений нужно как-то получить объект, после чего вызвать его ф-ю.
Объект (адрес) можно хранить в структуре окна где-либо, либо воспользоваться properties
Ф-й SetProp и GetProp
См. приложение- кусок базового класса одной моей библиотечки, которая работает (ну не нравиться
мне MFC- написал обёртку свою).
Если есть вопросы- в минифорум.
Приложение:
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 24.05.2006, 11:35
Отвечает: estiGi
Здравствуйте, Sn8p!
Собссно говоря, нельзя. Как сказал предыдущий оратор - нужен объект. Так же как и не получится с любым апишным колбаком, где нужен адрес функции.
А передать адрес объекта класса в WIndowProc можно и нескоьлко другим способом - обычно это делают через опциональный параметр - при создании окна см. параметр LPVOID lpParam в функции CreateWindow, для диалогов - см. параметр LPARAM dwInitParam в функциях CreateDialogParam и DialogBoxParam.
надеюсь, как вытскивать переданные параметры, разберешься, тут не сложно. Этот способ еще удобен, если нужно на один обработчик повесить несколько оконных/диалоговых классов.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 24.05.2006, 12:14
Вопрос № 44.135
Здравствуйте товарисчи Эксперты. Вопрос мой наверно уже задавался ни раз, но все мои попытки найти на него ответ не увенчался успехом... так вот:
1.Предположим что есть некая програма у которой в которой на главном окне висит компонент Edit. Я нахожу ВинСпектором дескриптор окна приложения и могу его находить через FindWindow по имени или классу окна, но как тогда найти декриптор компонета Эдит(перетащить прицел винспектра можно, но после перезапуска программы он(дискриптор) изменится, а FindWindow "отпрысков" не ищет, или же я не знаю как).
2. Пусть первая проблема разрешена и я могу находить дескриптор. Каким образом можно послать произвольный ТЕКСТ в поле этого компонента из собственно написаной програмы(измывался над эмуляциями нажатий на клаву, но так ничего и не достиг :( )? (если можно то с примером на дельфи, но и си раскурю).
Зарание спасибо.
Отправлен: 24.05.2006, 21:31
Вопрос задал: Infidel (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: mix_mix
Здравствуйте, Infidel!
1. Используйте не FindWindow, а FindWindowEx
HWND FindWindowEx
(
HWND hwndParent, // дескриптор родительского окна
HWND hwndChildAfter, // дескриптор дочернего окна
LPCTSTR lpszClass, // указатель имени класса
LPCTSTR lpszWindow // указатель имени окна
);
2. Используйте функцию SendMessage:
SendMessage(hWnd,WM_SETTEXT,0,"Hello!");
Ответ отправил: mix_mix (статус: 3-ий класс)
Ответ отправлен: 24.05.2006, 21:50 Оценка за ответ: 4 Комментарий оценки: С первой частью разобрался, но вот со второй не понял... ведь в Sendmessage lparam не строкового типа, а числового(интегер);
Отвечает: Zubex
Здравствуйте, Infidel!
1. См. предыдущий ответ...
2. SendMessage(hWnd,WM_SETTEXT,0,Integer(pChar('Hello!')));
Удачи!
--------- Если не знаешь что сказать - лучше промолчи...
Ответ отправил: Zubex (статус: 6-ой класс)
Ответ отправлен: 25.05.2006, 10:09 Оценка за ответ: 5 Комментарий оценки: мегаспасибо!
Отвечает: RSV
Здравствуйте, Infidel!
Procedure FindFieldB(var handle1, handle2 : THandle);
var hndl, hndl2, hndl3, hndl4 : THandle;wrect : TRect;
Begin
hndl2 := 0;
hndl3 := 0;
hndl4 := 0;
hndl := findwindow(nil, 'Приложение');
if hndl > 0 then
begin
hndl2 := findwindowex(hndl, 0, nil, 'WIN_MAIN_VIEW');
if hndl2 > 0 then
begin
hndl3 := findwindowex(hndl2, 0, 'Edit', nil);
repeat
if GetWindowRect(hndl3, wrect) then
if (wrect.Left = 772) and (wrect.Top = 174)
and (wrect.Right = 998) and (wrect.Bottom = 198) then
begin
hndl4 := hndl3;
end
else
hndl3 := GetNextWindow(hndl3, GW_HWNDNEXT);
until (hndl3 = 0) or (hndl4 <> 0);
end;
end;
handle1 := hndl4;
handle2 := hndl2;
End;
procedure NumToFieldB(Str : String);
begin
if not FlagHndl then
begin
FindFieldB(hndl, hndl2);
if hndl <> 0 then
FlagHndl := True;
end;
if FlagHndl then
begin
Clipboard.AsText := Str;
// SetForegroundWindow(hndl2);
if (sendmessage(hndl, WM_GETTEXTLENGTH, 0, 0) = 0) then
sendmessage(hndl, WM_PASTE, 0, 0);
SetForegroundWindow(hndl2);
end;
end;
Ответ отправил: RSV (статус: 1-ый класс)
Ответ отправлен: 25.05.2006, 14:10
Вопрос № 44.152
Как программно, с помощью функций WinAPI изменить имя компьютера и рабочей группы? Заранее благодарен.
Отвечает: Николай Б.
Здравствуйте, Дмитриев Алексей Иванович!
Используйте ф-цию SetComputerName(новое_имя) для изменения имени компьютера.
Для получения - ф-цию GetComputerName.
Обе ф-ции есть и в Delphi и в C++Builder. В Visual C++ - не проверял.
Удачи!
--------- Недавно прошёл тест на IQ. Результат отрицательный.
Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 25.05.2006, 07:14 Оценка за ответ: 4 Комментарий оценки: Надо бы рабочую группу, имя копьютера - заоодно написал