Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 250
от 30.05.2006, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 334, Экспертов: 39
В номере:Вопросов: 3, Ответов: 6


Вопрос № 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 изменить имя компьютера и рабочей группы? Заранее благодарен.
Отправлен: 25.05.2006, 00:23
Вопрос задал: Дмитриев Алексей Иванович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Николай Б.
Здравствуйте, Дмитриев Алексей Иванович!
Используйте ф-цию SetComputerName(новое_имя) для изменения имени компьютера.
Для получения - ф-цию GetComputerName.
Обе ф-ции есть и в Delphi и в C++Builder. В Visual C++ - не проверял.
Удачи!
---------
Недавно прошёл тест на IQ. Результат отрицательный.
Ответ отправил: Николай Б. (статус: 9-ый класс)
Ответ отправлен: 25.05.2006, 07:14
Оценка за ответ: 4
Комментарий оценки:
Надо бы рабочую группу, имя копьютера - заоодно написал


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.33 от 25.05.2006
Яндекс Rambler's Top100

В избранное