Запись в реестр Vista

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Запись в реестр Vista

Сообщение Source » 30.09.2007 (Вс) 1:08

Чтобы контрол Webbrowser отображал картинки независимо от настроек IE надо заменить значения неких ключей в реестре, но в инете вычитал, что такой способ в Vista не пройдёт. Действительно ли это так (нет возможности самому проверить) и если да, то что делать?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 18:05

WebBrowser спрашивает, отображать или нет картинки, у свого хоста.
Значит, нужно стать этим хостом.
У edanmo был пример. Потом он его убрал, но на archive.org он остался.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 18:43

а как насчёт записи в реестр в Vista?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.09.2007 (Вс) 18:51

tyomitch
А что если перехватить вызов чтения из реестра и подменить значение?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.09.2007 (Вс) 19:17

Весьма сложная вещь, ввиду особенностей механизмов работы с реестром. В данном случае нет нужды создавать виртуальные ключи, поэтому можно обойтись перехватом лишь 1 функции. В общем случае, надо перехватить около десятка, причём как-то создавать описатели ключей, которые не будут конфликтовать с системными + траблы с энумерацией.

Кстати, тот способ перехвата, что я вижу почти везде в корне неправилен - в каждом вызове восстанавливается исходный код, что не допустимо в многопоточной среде и ведёт к тормозам. Вместо этого нужно использовать другую технику, но она подразумевает частичное дизасемблирование - необходимо уметь узнавать размер ЛЮБОЙ инструкции.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.09.2007 (Вс) 19:24

Кстати, тот способ перехвата, что я вижу почти везде в корне неправилен - в каждом вызове восстанавливается исходный код, что не допустимо в многопоточной среде и ведёт к тормозам. Вместо этого нужно использовать другую технику, но она подразумевает частичное дизасемблирование - необходимо уметь узнавать размер ЛЮБОЙ инструкции.


А? В смысле? О чём ты?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 19:28

Source писал(а):а как насчёт записи в реестр в Vista?

Запись в реестр сосёт.
Потому что пользователь одновременно с твоей прогой откроет IE и очень удивится, откуда взялись картинки.
Потом пойдёт и отключит их во второй раз.
И тогда твоя прога обломается.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 19:40

keks-n писал(а):необходимо уметь узнавать размер ЛЮБОЙ инструкции.

Был бы отличный кирпич.
Вдохновляющая идея?
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.09.2007 (Вс) 19:42

Хакер
Основная техника перехвата состоит в следущем(есть ещё правка таблиц экспорта/импорта, но она несостоятельна):
1) Сохраняем первые 5 байт функции
2) Пишем всместо них JMP xxxxxxxx
3) При необходимости вызова оригинала пишем сохранённые байты, вызываем, пишем jmp обратно.

В итоге:
1) Пока работает оригинальная функция ОНА НЕ ПЕРЕХВАЧЕНА - её кто угодно может безконтрольно вызвать из соседнего потока.
2) При каждом вызове надо 2(два!) раза вызывать WriteProcessMemory, которая весьма медленна(вариант с VirtualProtect на функцию не рассматриваем).

Как это лечить:
При сохранении данных, надо копировать полностью скопировать в память одну или более команд, общей длинной более 5 байт в память с правами на исполнение, после них поставить jmp на адрес, следовавший за ними в оригинальной функции. При необходимости вызова оригинала передавать управление на этот участок.

Тогда происходит вызов фактически неизменной функции - всего лишь первая часть в другом месте.
Единственная трабла - если в функции есть вызов на смещения от начала функции с 1 до 4 - там будет лежать адрес, на который указывает новый jmp.


P. S. Если кому-то ничего не ясно - могу написать DLL, реализующую правильный перехват.
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.09.2007 (Вс) 19:45

tyomitch
Дизасемблер длин:
Код: Выделить всё

'Opcode Length Disassembler.
'Coded by GPcH
'Email: admin@dotfix.net
'Icq: 1195723
'Original version Coded By Ms-Rem ( Ms-Rem@yandex.ru ) ICQ 286370715


Const OP_NONE = &H0
Const OP_MODRM = &H1
Const OP_DATA_I8 = &H2
Const OP_DATA_I16 = &H4
Const OP_DATA_I32 = &H8
Const OP_DATA_PRE66_67 = &H10
Const OP_WORD = &H20
Const OP_REL32 = &H40

Public OpcodeFlags
Public OpcodeFlagsExt

Public Sub DisasmInitialize()
OpcodeFlags = Array(OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
    OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
    OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
    OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_DATA_PRE66_67, OP_MODRM Or OP_DATA_PRE66_67, OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, _
    OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_PRE66_67, _
    OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I32 Or OP_DATA_I16, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, _
    OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_DATA_I16, OP_NONE, OP_MODRM, _
    OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_PRE66_67, OP_DATA_I8 Or OP_DATA_I16, OP_NONE, OP_DATA_I16, OP_NONE, OP_NONE, OP_DATA_I8, OP_NONE, OP_NONE, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_I8, OP_NONE, OP_NONE, OP_WORD, OP_WORD, OP_WORD, _
    OP_WORD, OP_WORD, OP_WORD, OP_WORD, OP_WORD, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, _
    OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_I16 Or OP_DATA_I32, OP_DATA_I8, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM Or OP_REL32)

OpcodeFlagsExt = Array(OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, _
    OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
    OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
    OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
    OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
    OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
    OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, _
    OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, _
    OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, _
    OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE)

End Sub

'Получение полного размера машинной комманды по указателю на нее
Public Function SizeOfCode(Code() As Byte, ByRef pOpcode As Byte) As Long

    Dim PFX66 As Boolean, PFX67 As Boolean, SibPresent As Boolean
    Dim OffsetSize As Byte, Add As Byte, iMod As Byte, iRM As Byte, cPtr As Byte, Flags As Byte

    OffsetSize = 0
    PFX66 = False
    PFX67 = False
    cPtr = 0
    'определяем размер преффиксов
    While ((Code(cPtr) = &H2E) Or (Code(cPtr) = &H3E) Or (Code(cPtr) = &H36) Or (Code(cPtr) = &H26) Or (Code(cPtr) = &H64) Or (Code(cPtr) = &H65) Or (Code(cPtr) = &HF0) Or (Code(cPtr) = &HF2) Or (Code(cPtr) = &HF3) Or (Code(cPtr) = &H66) Or (Code(cPtr) = &H67))
      If (Code(cPtr) = &H66) Then PFX66 = True
      If (Code(cPtr) = &H67) Then PFX67 = True
      cPtr = cPtr + 1
      If (cPtr > 16) Then SizeOfCode = 0: Exit Function
    Wend
    If pOpcode Then pOpcode = Code(cPtr)
    'определяем размер опкода и получаем флаги
    If (Code(cPtr) = &HF) Then
      cPtr = cPtr + 1
      Flags = OpcodeFlagsExt(Code(cPtr))
    Else
      Flags = OpcodeFlags(Code(cPtr))
    End If
    cPtr = cPtr + 1
    If (Flags And OP_WORD) Then cPtr = cPtr + 1
    'обрабатываем MOD r/m
    If (Flags And OP_MODRM) Then
      iMod = Int(Code(cPtr) / (2 ^ 6))
      iRM = Code(cPtr) And 7
      cPtr = cPtr + 1
      'обрабатываем SIB и Offset
      SibPresent = (Not PFX67) And (iRM = 4)
      Select Case iMod
        Case 0:
          If (PFX67 And (iRM = 6)) Then OffsetSize = 2
          If ((Not PFX67) And (iRM = 5)) Then OffsetSize = 4
        Case 1: OffsetSize = 1
        Case 2: If (PFX67) Then OffsetSize = 2 Else OffsetSize = 4
        Case 3: SibPresent = False
      End Select
      If (SibPresent) Then
        If (((Code(cPtr) And 7) = 5) And ((Not iMod) Or (iMod = 2))) Then OffsetSize = 4
        cPtr = cPtr + 1
      End If
      cPtr = cPtr + OffsetSize
    End If
    'обрабатываем IMM значения
    If (Flags And OP_DATA_I8) Then cPtr = cPtr + 1
    If (Flags And OP_DATA_I16) Then cPtr = cPtr + 2
    If (Flags And OP_DATA_I32) Then cPtr = cPtr + 4
    If (PFX66) Then Add = 2 Else Add = 4
    If (Flags And OP_DATA_PRE66_67) Then cPtr = cPtr + Add
    SizeOfCode = cPtr '- Code
End Function


'Получение размера функции по указател на нее (размер до первой комманды RET)
Public Function SizeOfProc(Proc() As Byte) As Long
    Dim Length As Long, pOpcode As Byte, Result As Long
    pOpcode = 1
    Do
        Length = SizeOfCode(Proc, pOpcode)
        Result = Result + Length
        If ((Length = 1) And (pOpcode = &HC3)) Then Exit Do
        sProc = StrConv(Proc, vbUnicode)
        sProc = Right$(sProc, Len(sProc) - Length)
        Proc = StrConv(sProc, vbFromUnicode)
    Loop Until (Length < 1)
    SizeOfProc = Result
End Function


'определение того, имеет ли комманда rel32 offset
Public Function IsRelativeCmd(pOpcode As Byte) As Byte
  Dim Flags As Byte
  If (pOpcode = &HF) Then Flags = OpcodeFlagsExt(pOpcode + 1) Else Flags = OpcodeFlags(pOpcode)
  IsRelativeCmd = (Flags And OP_REL32)
End Function
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.09.2007 (Вс) 19:46

keks-n
Нефиг мне рассказывать теорию перехвата, я вон в соседней теме описывал теорию глобального перехвата.

Только я предалагал просто переносить оригинальный код функций.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 19:48

о чём вы? Я так понимаю, проблемы с записью в реестр? А как насчёт автозагрузки в реестре?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.09.2007 (Вс) 19:51

keks-n
А ты напиши полный дизассм. Он ведь нам в нашем великом деле понадобится :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 19:54

tyomitch писал(а):
Source писал(а):а как насчёт записи в реестр в Vista?

Запись в реестр сосёт.
Потому что пользователь одновременно с твоей прогой откроет IE и очень удивится, откуда взялись картинки.
Потом пойдёт и отключит их во второй раз.
И тогда твоя прога обломается.


Нет, моя прога не обломается. После загрузки первоначальной страницы, если флаг отображения картинок был установлен, WB будет их показывать, что бы там пользователь не делал в IE. Кроме того, сразу после загрузки первой страницы я сам восстановлю флаг в реестре. А загрузка страницы (т.е. момент изменённого флага, неправильного для пользователя) будет доли секунды.
Последний раз редактировалось Source 30.09.2007 (Вс) 19:56, всего редактировалось 1 раз.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 19:56

блин, хватит в моём топике о перехвате и ассемблере! Это другая тема!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 20:06

Source писал(а):После загрузки первоначальной страницы, если флаг отображения картинок был установлен, WB будет их показывать, что бы там пользователь не делал в IE.

Это неправда.
WB точно такой же IE, как все остальные.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 20:12

только что тестил, снял флаг в IE 6.0 (WinXP) после запуска проги с WB, нажал Применить, потом ok, картинки в IE не отображаются, WB отображает!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.09.2007 (Вс) 20:45

Это потому, что он закэшировал записи. Если в нём нажать F5, то они могут исчезнуть.
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 30.09.2007 (Вс) 21:36

1. создаю страницу с новыми картинками, всё отображается (временные файлы почистил). Это потому, что у мя WB.Offline=true :) А картинки берутся с диска. Но, если грузить начальную страницу со снятым флагом отображения картинок, картинок не будет.

2. Появилась проблема - страница html существует только в памяти, при нажатии F5 WB очищается...

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 01.10.2007 (Пн) 9:17

Заблокировать нажатие F5...
Salus populi suprema lex

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 01.10.2007 (Пн) 11:56

1. что там с записью в реестр Vista?

2. а как заблокировать? Form_KeyDown не получает vbKeyF5 при нажатии F5 на WB (на других контролах получает)!

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 01.10.2007 (Пн) 15:06

Заблокировать можно. Объяви WithEvents экземпляр класса HTMLDocument. Затем присвой ему ссылку на WebBrowser.Document и обрабатывай его событие KeyDown.
Salus populi suprema lex

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 01.10.2007 (Пн) 17:12

может, лучше поставить хук на перехват WM_KEYDOWN для WB?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 01.10.2007 (Пн) 19:16

Не легче (даже если сравнивать по размеру кода, а если ещё вспомнить про гемор с получением хэндла...). Всё что можно решить в рамках DOM, именно так и надо решать.
Salus populi suprema lex

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 01.10.2007 (Пн) 22:36

Написал в Declarations формы:
Private WithEvents EventsWB As HTMLDocument
в результате получилось (без параметров даже):
Private Sub EventsWB_onkeydown()
End Sub

затем в Form_Load:
Set EventsWB = WB.document

что дальше?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 02.10.2007 (Вт) 17:13

Ну и напиши туда
Код: Выделить всё
EventsWB.parentWindow.event.keyCode = 0


P.S. этот код заблокирует нажатие любой клавиши, если надо блокированть только F5, сначала проверяй этот самый keyCode.
Salus populi suprema lex

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.10.2007 (Чт) 0:28

да событие вообще не возникает EventsWB_onkeydown!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 04.10.2007 (Чт) 16:37

KeyPreview в свойствах формы отменили?
Изображение

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 04.10.2007 (Чт) 18:00

Source писал(а):1. что там с записью в реестр Vista?

2. а как заблокировать? Form_KeyDown не получает vbKeyF5 при нажатии F5 на WB (на других контролах получает)!

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 04.10.2007 (Чт) 18:02

keks-n писал(а):KeyPreview в свойствах формы отменили?

Стоп. Так мы про какое событие говорим? Я имел ввиду событие KeyDown не элемента управления WebBrowser, а объекта HTMLDocument.
Автору топика -- не видя весь код, не могу сказать почему так происходит. А вообще советовал бы почитать это. Там (в прикреплённом примере) соответствующее событие происходит и обрабатывается нормально.
Salus populi suprema lex


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 48

    TopList