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

RusFAQ.ru: Win API


Информационный Канал Subscribe.Ru


RusFAQ.ru: Win API

Выпуск № 036
от 20.12.2003, 20:10

Администратор:
Имя: Калашников О. А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 80
Отправлено ответов: 138
Активность: 172.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

BOLT
Статус: Профессиональный
Общий рейтинг: 171.03
URL: Начинающему программитсу: софт, примеры, документация, Assembler, C & C++.
Телефон: Три раза АУ!
[Подробней >>]
Neomant
Статус: Начальный
Общий рейтинг: 116.66
[Подробней >>]
fC
Статус: Профессиональный
Общий рейтинг: 151.36
URL: Тезка :)
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 78. Добрый вечер. Я пытался разобраться с функцией ReadConsoleOutputCharacter (с ее параметрами), но что... (ответов: 2)
Вопрос № 79. Уважаемые эксперты! Как сделать что-то вроде хука на стороннее приложение? Точнее, нужно вставить в ... (ответов: 1)

Вопросов: 2, ответов: 3


 Вопрос № 78

Добрый вечер.
Я пытался разобраться с функцией ReadConsoleOutputCharacter
(с ее параметрами), но что-то не получается. Подскажите пожалуйста как с ней работать.(если не трудно и с ф-ми
ReadConsoleOutput, WriteConsoleOutput)
Спасибо.



Вопрос отправлен: 14.12.2003, 18:10
Отправитель: Charodey

[Следующий вопрос >>] [Список вопросов]

Отвечает BOLT

Добрый день, Charodey!
Функция ReadConsoleOutputCharacter() считывает из буфера консольного окна инфу и складывает ее в символьный буфер( строку ).


BOOL ReadConsoleOutputCharacter(
HANDLE hConsoleOutput, // описатель буфера консоли
LPTSTR lpCharacter, // буфер, куда складывается инфа, размер = nLength * sizeof(TCHAR).
DWORD nLength, // кол-во символов
COORD dwReadCoord, // координата первого символа
LPDWORD lpNumberOfCharsRead // кол-во реально прочитанных символов
);

Вот пример, может он те поможет:


#include
/**************************************************************************************/
VOID main(
void)
{
HANDLE hStdout, hNewScreenBuffer;
SMALL_RECT srctReadRect;
SMALL_RECT srctWriteRect;
CHAR_INFO chiBuffer[160];
// [2][80];
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;

// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer = CreateConsoleScreenBuffer(
GENERIC_READ |
// read/write access
GENERIC_WRITE,
0,
// not shared
NULL, // no security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
NULL); // reserved; must be NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
MyErrorExit(
"CreateConsoleScreenBuffer");
}

// Make the new screen buffer the active screen buffer.

if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
MyErrorExit(
"SetConsoleActiveScreenBuffer");

// Set the source rectangle.

srctReadRect.Top = 0;
// top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 1;
// bot. right: row 1, col 79
srctReadRect.Right = 79;

// The temporary buffer size is 2 rows x 80 columns.

coordBufSize.Y = 2;
coordBufSize.X = 80;

// The top left destination cell of the temporary buffer is
// row 0, col 0.

coordBufCoord.X = 0;
coordBufCoord.Y = 0;

// Copy the block from the screen buffer to the temp. buffer.

fSuccess = ReadConsoleOutput(
hStdout,
// screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
MyErrorExit(
"ReadConsoleOutput");

// Set the destination rectangle.

srctWriteRect.Top = 10;
// top lt: row 10, col 0
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11;
// bot. rt: row 11, col 79
srctWriteRect.Right = 79;

// Copy from the temporary buffer to the new screen buffer.

fSuccess = WriteConsoleOutput(
hNewScreenBuffer,
// screen buffer to write to
chiBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect); // dest. screen buffer rectangle
if (! fSuccess)
MyErrorExit(
"WriteConsoleOutput");
Sleep(10000);

// Restore the original active screen buffer.

if (! SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit(
"SetConsoleActiveScreenBuffer");

}


Bolted by BOLT.

Ответ отправлен: 15.12.2003, 18:06
Отправитель: BOLT


Отвечает Neomant

Добрый день, Charodey!
imho вопрос задан не совсем корректно.
Прототипы функций:
BOOL ReadConsoleOutput(HANDLE hConsoleOutput,
PCHAR_INFO lpBuffer,
COORD dwBufferSize,
COORD dwBufferCoord,
PSMALL_RECT lpReadRegion);
и
BOOL WriteConsoleOutput(HANDLE hConsoleOutput,
CONST CHAR_INFO *lpBuffer,
COORD dwBufferSize,
COORD dwBufferCoord,
PSMALL_RECT lpWriteRegion);
,где
hConsoleOutput - хэндл консоли,
*lpBuffer - буфер приёмник(источник),
dwBufferSize - геометрический размер буфера источника,
dwBufferCoord - координаты в буфере источнике,
lpRead(Write)Region - геометрический размер буфера приёмника.
За более подробной информацией можно обратиться к справке Delphi Win32 API

Ответ отправлен: 17.12.2003, 06:13
Отправитель: Neomant


 Вопрос № 79

Уважаемые эксперты! Как сделать что-то вроде хука на стороннее приложение? Точнее, нужно вставить в меню чужого приложения свой пункт, и обрабатывать клик по нему (ес-сно уже своим приложением). Объясните хотя бы вкратце алгоритм (типа "получаешь хэндл окна..."). И если до момента вставки пункта как-нибудь вывернусь (хотя, надеюсь, у вас это было бы "красивее" :-)), то вот как обработать событие клика - мозгов уже не хватает... :-( Прошу помощи! Заранее спасибо, Nic



Вопрос отправлен: 16.12.2003, 20:00
Отправитель: Nic

[Следующий вопрос >>] [Список вопросов]

Отвечает fC

Здравствуйте, Nic!
Я делал следующим образом: запускал прогу и получив дескриптор её процесса вешал на него хук, который обрабатывал сообщение WM_COMMAND.
Сие творение качай отсюда http://formatC-vt.hotbox.ru/Loader_Example.rar [Delphi without VCL project - 3 KB]
Так же там я киляю лишние элементы, а тебе нужно добавить элемент в меню, для этого можешь воспользоваться функцией InsertMenuItem, грубо говоря - обратное действие, со всеми вытекающими отсюда последствиями.
Удачи!

Ответ отправлен: 16.12.2003, 22:11
Отправитель: fC



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (25)
C / C++ (17)
Perl (4)
Builder / Delphi (21)
Pascal (22)
Basic / VBA (3)
Java / JavaScript (5)
PHP (13)
Криптография (9)
WinAPI (11)
Пользователю
Windows 95/98/Me (37)
Windows NT/2000/XP (53)
"Железо" (25)
Поиск информации (19)
Администратору
Windows NT/2000/XP (27)
Linux / Unix (14)
Юристу
Гражданское право (12)
Семейное право (8)
Трудовое право (9)
КоАП (8)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное