Хук на "ПУСК"

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

Хук на "ПУСК"

Сообщение schalexey » 24.10.2005 (Пн) 13:11

Наверно я извращенец, но как установить онный на меню "ПУСК" или на "Все программы" (последнее предпочтительней). Чтобы вместо открытия данного меню выполнялось действие. Т.е. также требуется отключить его, но с возможностью обратного вклюючения.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 24.10.2005 (Пн) 14:04

Рисуем прозрачное окно поверх кнопки пуск и отрабатываем нажатие на него...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 24.10.2005 (Пн) 14:17

ANDLL писал(а):Рисуем прозрачное окно поверх кнопки пуск и отрабатываем нажатие на него...

И периодически проверяем, не переехала ли кнопка Пуск.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.10.2005 (Вт) 10:47

Тут показано, как найти hwnd "пуска". Сабклась его...
Вложения
startbutton.zip
(1.99 Кб) Скачиваний: 243
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение tyomitch » 25.10.2005 (Вт) 11:11

Antonariy, как предложишь сабклассить окна чужих процессов? ;-)
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.10.2005 (Вт) 11:12

Упс... Забыл об этом...
Лучший способ понять что-то самому — объяснить это другому.

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 25.10.2005 (Вт) 11:15

ага... а установить ее можно через setparent?? или как... а то в этом я не силен...

Я так думаю что и на кнопку "все программы" таким же образом можно поставить хук?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.10.2005 (Вт) 11:16

Ну тогда хук 8)
Лучший способ понять что-то самому — объяснить это другому.

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 25.10.2005 (Вт) 11:26

Antonariy эт и так понятно... лучше скажи как ))

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.10.2005 (Вт) 11:29

Поиском ))

Ну нету под рукой примера!

Ищи по развалам искодников PeekMessage
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.10.2005 (Вт) 11:33

Не ищи по развалам исходников PeekMessage. Ищи по развалам исходников расширялку часов в трее.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 26.10.2005 (Ср) 16:55

Код: Выделить всё

Dim lButton As Long, lAllProg As Long, lhwnd As Long
Private Sub Form_Load()
Dim str As String
lhwnd = FINDWINDOW("DV2ControlHost", vbNullString)
lAllProg = FindWindowEx(lhwnd, 0&, "Desktop More Programs Pane", vbNullString)
lButton = FindWindowEx(lAllProg, 0&, "Button", vbNullString)

Debug.Print GetWndText(lButton)

  OldProc = GetWindowLong(lButton, GWL_WNDPROC)
  SetWindowLong lButton, GWL_WNDPROC, AddressOf WndProc
End Sub


Использую это... но почему-то не возвращается адрес процесса... что не так??

ЗЫ название классов проверил в Spy++

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2005 (Ср) 17:32

А ГДЕ должен возвращаться адрес процесса?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 26.10.2005 (Ср) 17:44

ANDLL
OldProc = GetWindowLong(lButton, GWL_WNDPROC)
адресс родного процесса.... который потом подменю на свой.. но он не дает его... а должен

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

Сообщение tyomitch » 26.10.2005 (Ср) 18:06

Для тех, до кого с первого раза не дошло: невозможно сабклассить окна чужих процессов.
Изображение

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 26.10.2005 (Ср) 18:10

tyomitch тогда еще вопрос.. тож не умнее... а как тогда Spy++ ловиит для него сообщения.... или он ловит все что по винде носится и фильтрует их?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.10.2005 (Ср) 18:22

Вот именно. SetWindowsHookEx. Это не сабклассинг.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2005 (Ср) 18:23

А библиотеку SPYHK55.DLL ты у него не заметил?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 27.10.2005 (Чт) 15:36

ANDLL
можешь дать примерный код.. а то пытаюсь сделать... на родное окно вешается... а туда куда надо нет...

ЗЫ в сабклассинге и других премудростях из той оперы ничего не знаю... раньше не пользовался.. так что просьба не наезжать а давай конструктивные советы.

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

Сообщение tyomitch » 27.10.2005 (Чт) 15:59

GSerg писал(а):Ищи по развалам исходников расширялку часов в трее.
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 20.05.2006 (Сб) 17:17

Chris писал(а):Microsoft certainly does not recommend disabling the Windows Start button,
but it can be done. The most obvious problem in doing this is that if your
application terminates unexpectedly, it will leave the Start button
disabled. It also works against the intention of the Windows design to
allow users access to the Start menu. However, if this is important for you
application, the best way to do this is to use a DLL written in VC++ that
uses a System wide, or thread specific message hook to capture the messages
that will bring up the Start menu. In fact, you cannot do this from a VB
DLL. The best we can do from VB is to disable the button itself, but this
will not prevent the Windows button or the shortcut keys from working. That
is why you need the hook. So, you can use FindWindow to find the Taskbar,
then use EnumChildWindows to find the Start button and EnableWindow to
disable it. Disabling it makes the Start button an ugly gray button, but it
will keep users from clicking on it. So you can use code like this in your
form:

Private Sub Form_Load()
Dim WinClass As String
Dim TaskBarHwnd As Long, lRet As Long, lParam As Long


WinClass = "Shell_TrayWnd"
TaskBarHwnd = FindWindow(WinClass, vbNullString)
If TaskBarHwnd = 0 Then
MsgBox "Could not find the Taskbar!"
Exit Sub
End If
lRet = EnumChildWindows(TaskBarHwnd, AddressOf EnumChildProc, lParam)
End Sub


Private Sub Form_Unload(Cancel As Integer)
Dim RetVal As Long


If StartButtonhWnd <> 0 Then
RetVal = EnableWindow(StartButtonhWnd, True)
End If
End Sub


You will also need code like this in a Module:


Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, ByVal fEnable As Long) As Long
Public Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long


Public StartButtonhWnd As Long


Function EnumChildProc(ByVal lhWnd As Long, ByVal lParam As Long) _
As Long
Dim RetVal As Long
Dim WinClassBuf As String * 255
Dim WinClass As String


RetVal = GetClassName(lhWnd, WinClassBuf, 255)
WinClass = StripNulls(WinClassBuf) ' remove extra Nulls & spaces
If WinClass = "Button" Then
StartButtonhWnd = lhWnd
RetVal = EnableWindow(StartButtonhWnd, False)
EnumChildProc = False ' Stop looking
Else
EnumChildProc = True ' Keep looking
End If
End Function


Public Function StripNulls(OriginalStr As String) As String
' This removes the extra Nulls so String comparisons will work
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function


While this will disable the Start button when the form loads and enable it
again when the from unloads, it does not prevent the user from bringing up
the Start menu using the keyboard. This is why you need the VC++ DLL. This
would need to set a WH_GETMESSAGE hook to capture the WM_SYSCOMMAND
message. Then it needs to take a look at the wParam of that message. If it
is equal to SC_TASKLIST, then it must not pass that message on to the
intended receiver. Again, the hook must either be a system-wide hook or a
thread-specific hook on the thread that would receive that message. You can
get this thread by calling GetWindowThreadProcessId on the hwnd of the
SHELL_TRAYWND (or the desktop).


You may also want to consider having your form cover the Taskbar. Here are
some Knowledge Base articles you may want to read:


Q197585 - HOWTO: Cover the Taskbar with a Window in Visual Basic
Q183009 - HOWTO: Enumerate Windows Using the WIN32 API
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 20.05.2006 (Сб) 17:22

На счет сабклассинга окошек других процессов вы, ребята, не совсем правы. Это можно сделать, если внедрить свой DLL файл в адресное пространство другого процесса, тогда, собственно, вам уже все равно, что это за процесс :). Если не ошибаюсь, то зафигачить в процесс свой DLL можн офункцией CreateRemoteThread.

В 16-битных Windows адресное пространство было общим... Эх, были времена. Сабклась что хочешь :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

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

Сообщение tyomitch » 20.05.2006 (Сб) 17:24

gaidar писал(а):На счет сабклассинга окошек других процессов вы, ребята, не совсем правы. Это можно сделать, если внедрить свой DLL файл в адресное пространство другого процесса,

Это назвается "хук". О чём и речь.

gaidar писал(а):Если не ошибаюсь, то зафигачить в процесс свой DLL можн офункцией CreateRemoteThread.

Ошибаешься.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.05.2006 (Сб) 23:41

gaidar писал(а):Если не ошибаюсь, то зафигачить в процесс свой DLL можн офункцией CreateRemoteThread.
Если не ошибусь, то только с помощью WriteProcessMemory.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 21.05.2006 (Вс) 0:04

Далеко не только с помощью WriteProcessMemory.
В частности, обсуждаемые здесь хуки тоже загружают библиотеку-обработчик в чужой процесс.
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 21.05.2006 (Вс) 12:19

tyomitch писал(а):
gaidar писал(а):На счет сабклассинга окошек других процессов вы, ребята, не совсем правы. Это можно сделать, если внедрить свой DLL файл в адресное пространство другого процесса,

Это назвается "хук". О чём и речь.


Да, да. Я был против категоричного высказывания, что этого сделать СОВСЕМ нельзя.

tyomitch писал(а):
gaidar писал(а):Если не ошибаюсь, то зафигачить в процесс свой DLL можн офункцией CreateRemoteThread.

Ошибаешься.

[/quote]

Да, ошибаюсь :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList