Как на Foth прочитать URL броузера IE?

 
RU FORTH_beginner #20.09.2003 16:49
+
-
edit
 

FORTH_beginner

новичок
Добрый день всем!
Случайно проходил мимо и увидел тут специалистов по Forth.
Пользуюсь случаем, чтобы задать пару-тройку вопросов по forth.

Я недавно (2 дня назад) познакомился с языком FORTH и он мне сразу понравился.
Вот моя проблема:
Мне нужно програмным путем прочитать, что написано в адресной строке IE.
В WINDOWS API есть такая фунцкия :
Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long

Если аргумент Msg установить WM_GETTEXT (= 13), то эта функия вернет длину строки текста содержащегося в окне hwnd, а
lParam заполнит самим текстом
На VisualBasic это реализуется очень просто,
А как это реализовать на Foth?

Если можно, дайте пожалуйста конретный пример

Большое спасибо
 
+
-
edit
 

Balancer

администратор
★★★★★
nnCron?

Вот пример, с помощью которого можно прочитать текст в поле ввода в Notepad'е.
WINAPI: SendMessageA  user32 WINAPI: FindWindowA  user32 WINAPI: FindWindowExA user32 [color=#008c00; ]13[/color] CONSTANT WM_GETTEXT [color=#008c00; ]1024[/color] CONSTANT /BUF CREATE BUF /BUF [color=#008c00; ]1[/color]+ ALLOT : FindWindow    [color=#696969; ]( $class $win — hwnd)[/color] DROP SWAP DROP SWAP FindWindowA ; : FindWindowEx  [color=#696969; ]( p-win ch1-win $class $win — hwnd)[/color] DROP SWAP DROP SWAP ROT [color=#008c00; ]3[/color] ROLL FindWindowExA ; : SendMsg      [color=#696969; ]( hwnd wparam lparam msg — retcode)[/color] >R SWAP ROT R> SWAP SendMessageA ; : GetText      [color=#696969; ]( hwnd — $ = получить содержимое окна)[/color] /BUF BUF WM_GETTEXT SendMsg BUF SWAP ; [color=#0000e6; ]S" Notepad"[/color] [color=#008c00; ]0[/color] [color=#008c00; ]0[/color] FindWindow [color=#008c00; ]0[/color][color=#0000e6; ] S" Edit"[/color] [color=#008c00; ]0[/color] [color=#008c00; ]0[/color] FindWindowEx GetText TYPE
Created with colorer-take5 library. Type 'forth'


IE ищется также.
[color=#0000e6; ]S" IEFrame"[/color] [color=#008c00; ]0[/color] [color=#008c00; ]0[/color] FindWindow
Created with colorer-take5 library. Type 'forth'


Только чтобы до строки адреса потом добраться - нужно ещё в дочерних классах шариться. Но это мне уже лениво писать. Spy++ - и вперёд. Впрочем, если тебе достаточно только заголовка окна IE - то и этого хватит.
 
Это сообщение редактировалось 16.12.2003 в 16:11
RU FORTH_beginner #20.09.2003 18:06
+
-
edit
 

FORTH_beginner

новичок
Огромное спасибо!
Прямо сейчас начну разбираться

>nnCron? :)


Да он самый


>Только чтобы до строки адреса потом добраться - нужно ещё в дочерних >классах шариться. Но это мне уже лениво писать. Spy++ - и вперёд. >Впрочем, если тебе достаточно только заголовка окна IE - то и этого хватит.


Нет, на самом деле мне недостаточно только заголовка.
Поясню.
У меня установлен nnCron который может отслеживать окна по названию заголовка, но к сожалению текст в окне заголовка он не читает.
Я стал разбираться глубже и понял, что Forth - это то что надо для меня, до этого я писал свои программы на VB.

Короче, в nnCron есть функия
WatchWindow: "pattern"
Я хочу написать функцию
WatchWindowURL: "pattern"

Для чего это мне надо - долго рассказывать, но очень нужно.
Она должна работать примерно вот так:
 задаю
WatchWindowURL: "server.com/folder/"
 открываю IE, иду на сайт
и как только сайт загружается, мне, к примеру должно выскочит окошко с напоминание о том, что я здесь сегодня уже был

Возможно мои вопросы выглядят коряво, но мне жутко интересно это (такую функию) сделать



Еще раз огромное спасибо!
 
+
-
edit
 

Balancer

администратор
★★★★★
FORTH_beginner, 20.09.2003 18:06:21:
Нет, на самом деле мне недостаточно только заголовка.
 

Ну, тогда по всяким FirstChild/NextChild и т.п. Не помню, как они называются. а MSDN грузить лень
 
RU FORTH_beginner #20.09.2003 18:28
+
-
edit
 

FORTH_beginner

новичок
Balancer, большое спасибо,
я вот начал изучать forth, и часто встречаю
вот таки слова:
S" string"
Z" string"

что это такое
S"
Z"
Я нигде в описаниях не нашел этого ?
 
+
-
edit
 

Balancer

администратор
★★★★★
S" - слово из стандарта ANS93. Берёт строку до следующей кавычки и компилирует в виде строки, помещая на стек её длину и адрес. Т.е. в том формате, который требуется, скажем, слову TYPE

S" Hello, world!" TYPE

Z" - нестандартное слово. Судя по всему - для размещения строки с замыкающим нулём (для WinAPI, например). Впрочем, стоит помнить, что на самом популярном - SP-Forth, слово S" всегда в конце строки добавляет замыкающий ноль. Т.е. стока на один байт длиннее положенного, зато сразу ASCIIZ. Достаточно сбросить со стека длину - и получим строку в готовом для WinAPI-функций виде.

0
S" Test" DROP \ если не перепутал их (title и text) порядок - должны быть
S" Title" DROP \ в обратном сиошному.
0
MessageBoxA
 
RU FORTH_beginner #21.09.2003 11:56
+
-
edit
 

FORTH_beginner

новичок
Balancer, добрый день,

Ваш пример уже работает у меня.
Правда пришлось потрудится.
А именно с
: FindWindowEx ( p-win ch1-win $class $win — hwnd) DROP SWAP DROP SWAP ROT 3 ROLL FindWindowExA;
: SendMsg ( hwnd wparam lparam msg — retcode) >R SWAP ROT R> SWAP SendMessageA;

С этими DROP SWAP >R ROT , трудно было увязать это в голове в одну нить.

Я понял, что это для удобства применения , что бы функция выглядела так, как WIN API, но это меня как раз и запутало. Я ведь второй день только Forth изучаю и мне трудно выявить физику процесса, когда много перестановок типа SWAP ROT
Но ... заработало... !
Хоть и работает, но вот это до конца не могу переварить (как это присходит на низком уровне? ):

: GetText ( hwnd — $ ) /BUF BUF WM_GETTEXT SendMsg BUF SWAP ;

 
 
+
-
edit
 

Balancer

администратор
★★★★★
FORTH_beginner, 21.09.2003 11:56:20:
Хоть и работает, но вот это до конца не могу переварить (как это присходит на низком уровне? ):
 

На самом деле, ядро Форта - самое простое среди всех языков

Никаких опережений по тексту, программа исполняется слово за словом. Каждое слово что-то меняет на стеке, что-то туда кладёт.

: FindWindowEx \ определить новое слово с указанным именем.
 ( p-win ch1-win $class $win — hwnd) \ просто комментарий, где рассказывается что делает слово
DROP \ снять число со стека. Просто удалить. Длина у $win нам не интересна
SWAP \ поменять местами два числа на вершне стека
DROP \ опять удалить. теперь это длина $class
SWAP \ опять меняем
ROT \ операция "прокрутки" Достём со стека 3-е число: a b c — b c a
3 ROLL \ достаём 4-е число )отсчёт от "0": a b c d — b c d a
FindWindowExA \ вызываем с получившимися данными в стеке WinAPI-функцию.
\ стот помнить, что C/C++ в стек запихивает параметры в обратном порядке. Сперва самый последний, в конце - первый. Просто для func(a,b,c,d...) компилятор сам запихнёт сперва d, потом c, ... потом a, а в Форте в таком порядке надо и самому помещать. Впрочем, можно определить слово, которое поменяет местами N чисел в стеке
; \ точка с запятой - завершает определение слова, начатое двоеточием.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru