Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VictorMi

Цитата:
Интересно, почему в функцию KeyboardProc (которая работает с хуками) не передается хандл окна и вид сообщения?

А зачем описатель окна передавать? Сообщения обрабатывает поток, а не окно (каждому окну сопоставляется поток, но не наоборот), а хук вызывается в контексте уже определённого потока, так что зачем переопределённость?
А параметры сообщения функции KeyboardProc передаются  

Код:
 
LRESULT CALLBACK KeyboardProc(          int code,
    WPARAM wParam,
    LPARAM lParam
);
Parameters
 
code
[in] Specifies a code the hook procedure uses to determine how to process the message. If code is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values.
HC_ACTION
The wParam and lParam parameters contain information about a keystroke message.
HC_NOREMOVE
The wParam and lParam parameters contain information about a keystroke message, and the keystroke message has not been removed from the message queue. (An application called the PeekMessage function, specifying the PM_NOREMOVE flag.)
wParam
[in] Specifies the virtual-key code of the key that generated the keystroke message.
lParam
[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
 


----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 02:47 02-03-2005
vTaurus



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем, доброго времени суток!
Есть такая задача:
Скопировать текст из окна IE в другую программу.  
В VB все просто:

Код:
 
    Dim ie As Object
    Set ie = CreateObject("Internetexplorer.Application")
    ie.Visible = True
    ie.Navigate "C:\Temp\test.html"
    While ie.Busy
    Wend
    SendKeys ("^a")
    SendKeys ("^c")
    ie.Quit
    далее куда надо вставляю = Clipboard.GetText
 

но криво, и я хочу, чтобы юзер не видел окно IE, а если сказать ie.Visible = False, то ничего не работает.
Пытаюсь сделать тоже самое используя WinAPI нифига не получается. Посмотрел, что ловит Spy++ и попытался этоже транслировать в IE, для начала хотя бы Ctrl+A, чтобы выделился текст:

Код:
 
    Dim lHWND As Long
 '   lHWND = &H2408F2
    lHWND = &H1907CC
    Debug.Print PostMessage(lHWND, WM_KEYDOWN, VK_CONTROL, &H1D0001)
    DoEvents
    Debug.Print PostMessage(lHWND, WM_KEYDOWN, &H41, &H11E0001)
    DoEvents
    Debug.Print PostMessage(lHWND, WM_KEYUP, VK_CONTROL, -1071841279)
    DoEvents
    Debug.Print PostMessage(lHWND, WM_KEYUP, &H41, &HC11E0001)
    DoEvents
 

HWND - я брал разные окна и IEFrame и Shell DocObject View и Internet Explorer_Server
результат ноль.
Все PostMessage возвращают 1
А в Spy++ все тоже самое, что при нажати Ctrl+a с клавиатуры, только между событиями WM_KEYDOWN и WM_KEYUP появлется событие WM_CHAR chCharCode:'a' (97) cRepeat:1 ...
 
Подскажите, что не так делаю.

Всего записей: 37 | Зарегистр. 10-12-2001 | Отправлено: 16:21 03-03-2005 | Исправлено: vTaurus, 16:24 03-03-2005
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vTaurus
А задача какова?
1. Просто взять текст, который является результатом процессинга HTML?
2. Скопировать текст с возможными рисунками в клипборд?
3. Еще что нибудь?
ИМХО, тут лучче оперировать самим ИЕ-контролом. У него можно взять интерфейсы документа, у которого можно взять внутренний текст и т.д. Или еще попользовать какие методы.

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 16:26 03-03-2005
vTaurus



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
А задача какова?  
1. Просто взять текст, который является результатом процессинга HTML?  
2. Скопировать текст с возможными рисунками в клипборд?  

Да именно это и нужно. У объекта CreateObject("Internetexplorer.Application")  нет методов и свойст отдающих тект с ссылками и прочей ерундой. Есть свойство Document типа IHTMLDocument, IHTMLDocument2 и IHTMLDocument3. Но это путь дремучий, и задача того не стоит, поэтому я сначала попробывал по простому. Меня очень устраивается клипбоард, т.к. мне этот текст надо вставить в Lotus Notes.  
В Lotus Notes свои заморочки, и мне наобходимо обойтись без внешних ActiveX. Только то, что есть на всех клиентских компьютерах.

Всего записей: 37 | Зарегистр. 10-12-2001 | Отправлено: 18:12 03-03-2005
VictorMi

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert
Спасибо за ответ. Я уже начал понимать больше, но еще не до конца.

Цитата:
Сообщения обрабатывает поток, а не окно  

Оно конечно так. Но самым простым кажется -- передавать в KeyboardProc -- код + все сообщение в виде структуры. Однако разработчики сделали не так. Меня не оставляет чувство, что здесь специально урезают возможности программиста. Почему - не понятно до конца.
  Вот мой пример. Есть приложение -- там куча диалогов. Хочу, чтобы ВЕЗДЕ клавиша пробел работала как ОК. Если бы было как я написал, то все реализуется одним хуком. Получил WM_CHAR c пробелом в KeyboardProc , проверил, что от диалога, направил в тот диалог WM_COMMAND с ОК. Все.  
А как в реальности это сделать коротко?

Всего записей: 819 | Зарегистр. 30-06-2004 | Отправлено: 11:46 09-03-2005
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VictorMi
KeyboardProc служит только для наблюдения -- изменять этот хук не может.  
 

Цитата:
Есть приложение -- там куча диалогов. Хочу, чтобы ВЕЗДЕ клавиша пробел работала как ОК. Если бы было как я написал, то все реализуется одним хуком. Получил WM_CHAR c пробелом в KeyboardProc , проверил, что от диалога, направил в тот диалог WM_COMMAND с ОК. Все.

Так что мешает всё это дело встроить в оконную процедуру? И не надо никакого хука -- ведь приложение же ваше? Или же, можно надкласс диалоговых окон можно создать. Правда, всё это относительно просто делается, если Вы пишете на C, с применением WinAPI. Если же используете вещи типа Delphi -- мои сочувствия, там всё через заднее место.


----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 04:01 11-03-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert

Цитата:
 Если же используете вещи типа Delphi -- мои сочувствия, там всё через заднее место.

Не надо вводить народ в заблуждение, если голова на месте и руки не из пояса растут, то все делается нормально и на Дельфи. Почему у Сишников  (кстати не С, а С++ если не ошибаюсь) считается что на Дельфи АПИ плохо реализуется? Просто на С это более прозрачно, а на Дельфи часть скрыта от пользователей, но если разобраться с внутренностями, то все нормально реализуется.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:02 11-03-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
06:02 11-03-2005
Цитата:
Просто на С это более прозрачно, а на Дельфи часть скрыта от пользователей, но если разобраться с внутренностями, то все нормально реализуется.

А для того, чтобы проще было разобраться все Delphi идут с исходными текстами своих библиотек. Всё просто и понятно. Для нетерпеливых - VCL. Для остальных практически полная поддержка WinAPI.

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 06:48 11-03-2005 | Исправлено: mr_eoi, 06:55 11-03-2005
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Просто на С это более прозрачно, а на Дельфи часть скрыта от пользователей, но если разобраться с внутренностями, то все нормально реализуется

Ловлю тебя на слове -- в C действительно всё прозрачно, а Delphi -- это ведь  
нечто вроде детского набора-конструктора: кубики, из которого надо быстренько что-то собрать. Так зачем считать разбор внутренностей этих кубиков за разумное решение? Я ведь об этом говорил! Человеку нужна ясность, не загромождённая разбором всяких там ненужных внутренностей Delphi. Ведь все вещи надо использовать по назначению, а Delphi для системного программирования не предназначен (хотя извращаться запрещать не вправе никто). Штаны снимать через голову не запретишь, иными словами.
 
mr_eoi

Цитата:
А для того, чтобы проще было разобраться все Delphi идут с исходными текстами своих библиотек. Всё просто и понятно. Для нетерпеливых - VCL. Для остальных практически полная поддержка WinAPI

Как посмотрел однажды, как реализуются некоторые вещи... Аж ужас... Требовалось подключение каких-то библиотек, кажется, для разделения памяти... При этом такие ограничения...
Вообще, Delphi, можно считать, умер после ухода Хейлсберга -- на 3-й версии. Но спорить не стану -- для быстрого показа она годится, хотя уже есть Visual Studio NET, на котором то же самое можно сделать.
 
P. S. Начинал с Delphi 1.0, бросил на 3.0, для системного программирования определённо не предназначен.

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 03:22 13-03-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert

Цитата:
P. S. Начинал с Delphi 1.0, бросил на 3.0, для системного программирования определённо не предназначе

Естесственно, и с этим никто не спорит, Дельфи больше заточен под ПРИКЛАДНОЕ программирование. И кстати, я не утверждал обратное, по крайней мере у себя в посте я такой мысли не обнаружил, а если
Цитата:
 Или же, можно надкласс диалоговых окон можно создать.
считается системным программированием, то мне нечего сказать более. . ИМХО не надкласс, а подкласс, так как они будут иметь в качетсве родителя диалогывуе окна, но со своими некоторыми свойствами. Насчет Дельфи и С есть отдельный топик, и там достаточно уже копий поломали, так как сам по себе спор флудерский и смысла никакого не несет Все это ИМХО.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:48 13-03-2005
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
...я не утверждал обратное, по крайней мере у себя в посте я такой мысли не обнаружил

Это да, но совсем некстати стал оправдывать Delphi, поскольку речь шла всё же о задачах, не совсем относящихся к прикладному, а скорее системному программированию. Если не веришь, почитай книгу Рихтера и Локи, уж Рихтер до тривиальных вещей не опускается.
 

Цитата:
...считается системным программированием, то мне нечего сказать более

Ещё как.
 

Цитата:
ИМХО не надкласс, а подкласс, так как они будут иметь в качетсве родителя диалогывуе окна, но со своими некоторыми свойствами

В книге Рихтера и Локи есть примеры как надклассов, так и подклассов диалоговых окон. Весьма поучительные.

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 04:20 15-03-2005
VictorMi

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert

Цитата:
В книге Рихтера и Локи есть примеры как надклассов, так и подклассов диалоговых окон. Весьма поучительные.

Хотелось бы знать полное название книги. И можно ли ее скачать где-либо?
 

Всего записей: 819 | Зарегистр. 30-06-2004 | Отправлено: 17:15 25-03-2005
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот: Jonathan Locke, Jeffrey M. Richter, Windows 95 : A Developer's Guide. John Wiley & Sons, Incorporated, 1995.
 
Книга прекрасная, написана прекрасным аглицким (Рихтер не в пример другим его коллегам вообще классно пишет), почему-то эта книга на русский не переведена (насколько мне известно). И, как уже выше упоминал, эта книга не о том, как "накидать кнопки и сварить прогу за 5 минут".
 
У меня, как уже очевидно, на аглицком, в электронном виде, выдернул из CD серии "Developper Source". Полуфабрикат в виде doc-файла, собирался делать pdf с включением рисунков, но нет времени.
 
P. S. Вот тут кто-то продаёт за $5.35:
http://www.biblio.com/books/1924985.html

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 04:31 27-03-2005
SaDFromSpb



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
  По корректности выполнения многих функций можно судить по возвращаемому ими значению. С помощью него можно в программе проверять, корректно ли отработала функция, и сообщать пользователю об ошибке, если она была. Но как быть, если внутри функции происходит серьезная ошибка, из-за которой аварийно завершается все приложение? Требуется не позволить приложению завершиться аварийно. Так же, не очень понимаю, как можно дебажить такие случаи. А то вылезает код на асме (неужели именно в нем копаться)...

Всего записей: 209 | Зарегистр. 22-06-2004 | Отправлено: 20:06 16-04-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
SaDFromSpb
Во многих языках есть конструкции для этого, например в Делфи

Код:
 
try
  тут код с возможной ошибкой
except
 //сюда попадём, если есть ошибка
  on EZeroDivide do HandleZeroDivide;//Если было деление на ноль
  on EOverflow do HandleOverflow;//Если было переполнение
  on EMathError do HandleMathError;//Ошибка математики
else
  HandleAllOthers;//Если ничего выше перечисленого не подошло
end;
 

В С точно есть что-то подобное

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 20:22 16-04-2005 | Исправлено: OdesitVadim, 21:03 16-04-2005
Nikopoloc

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос .Сейчас учусь программировать на WinApi и хотел чтобы не парится каждый  
раз с регистрациеей класса окна вынести ее в отдельную функцию зделал так:
 
Reg(WNDPROC Proc,LPCTSTR szName)
{
    WNDCLASS w;
    memset(&w,0,sizeof(WNDCLASS));
    w.style= CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc= Proc;
    w.hInstance=hInstance;
    w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    w.lpszClassName= szName ;
    w.hIcon = LoadIcon ( NULL, IDI_APPLICATION);
    w.hCursor = LoadCursor (NULL, IDC_ARROW);
    return RegisterClass(&w);
}
 
Но при комптляции выдает такую ошибку:
D:\Microsoft Visual Studio\MyProjects\Library\tst.cpp(75) : error C2065: 'hInstance' : undeclared identifier
D:\Microsoft Visual Studio\MyProjects\Library\tst.cpp(75) : error C2440: '=' : cannot convert from 'int' to 'struct HINSTANCE__ *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
 
Собственно что не так?
ps Сорри если ламерский вопрос я пока только учусь.

Всего записей: 7 | Зарегистр. 29-09-2005 | Отправлено: 13:37 27-11-2005
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так компилятор же говорит, что не так - не знает он, что такое hInstance, и откуда его брать. Proc ты в функцию передаёшь, szName тоже, а hInstance?

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 13:44 27-11-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nikopoloc
Кроме того, что уже сказал Abs62 функция Reg возвращает некое значение, это надо указать.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 14:08 27-11-2005
Nikopoloc

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сенкс зделал:
int Reg(WNDPROC Proc,LPCTSTR szName,HINSTANCE hInstance)
и все заработало еше такой вопрос пытаюсь вызвать OpenDialog  
 
 
PENFILENAME ofn;// структура стандартного диалогового окна
char szFile[260];// буфер для имени файла
               
HANDLE hf;              // дескриптор файла
 
// Инициализация OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
// Покажем диалоговое окно Открыть (Open).
 
if (GetOpenFileName(&ofn)==TRUE)
hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
0, (LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
        }
 
компилятор ошибки не выдает но диалог не появляется.
ps Где можно посмотреть теги форума как выделять код.

Всего записей: 7 | Зарегистр. 29-09-2005 | Отправлено: 16:00 27-11-2005 | Исправлено: Nikopoloc, 16:02 27-11-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nikopoloc
Лучшая дока по WinAPI: MSDN

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 17:53 27-11-2005 | Исправлено: KADABRA, 17:54 27-11-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru