Отловить двойное нажатие Ctrl и передать форме фокус

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

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Хакер » 03.04.2012 (Вт) 20:39

VBTerminator. Причём тут RegisterHotkey? Вопрос не в том, как отловить нажатие, а в том, как показать окно обойдя систему защиты от кражи фокуса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 03.04.2012 (Вт) 20:44

:) :) :) :) :) :) :)

Ребята, получилось!!!!


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

Private Const SW_SHOWNORMAL = 1

Private Type RECT
   Left    As Long
   Top     As Long
   Right   As Long
   Bottom  As Long
End Type

Private Type POINTAPI
   x       As Long
   y       As Long
End Type

Private Type WINDOWPLACEMENT
   length            As Long
   flags             As Long
   showCmd           As Long
   ptMinPosition     As POINTAPI
   ptMaxPosition     As POINTAPI
   rcNormalPosition  As RECT
End Type

Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long


Private Sub Tut_Focus()
    Dim hWndToActivate As Long
    Dim currRect As RECT
    Dim currWinP As WINDOWPLACEMENT
 
    hWndToActivate = Form1.hwnd
 
    currWinP.length = Len(currWinP)
    Call GetWindowPlacement(hWndToActivate, currWinP)
   
    currWinP.length = Len(currWinP)
    currWinP.flags = 0&
    currWinP.showCmd = SW_SHOWNORMAL


    Call SetWindowPlacement(hWndToActivate, currWinP)
 
    List1.SetFocus
End Sub


Первоисточник тут vbnet.mvps.org



Всем огромное спасибо за поддержку!
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Хакер » 03.04.2012 (Вт) 20:45

Зато вот я вижу на скриншоте, что AIMP импортирует SetWindowPos. То есть вполне возможно, что всё так, как я угадал: возможно он проделывает тот самый грязный трюк с выставлением себе на миг положения «поверх всех».

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

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

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Хакер » 03.04.2012 (Вт) 20:47

sosed213 писал(а):Ребята, получилось!!!!

Это такой же грязный трюк, только другой.

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

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 03.04.2012 (Вт) 20:51

Это как говорится "Во что-то нужно верить"

Как я рассуждаю: за основу беру, любой, первый попавшийся способ, и пользуюсь им пока не найдется опровержение ему.

Так и тут, этот "грязный способ", он работает, а лучше пока нету...
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Хакер » 03.04.2012 (Вт) 20:52

sosed213 писал(а):Так и тут, этот "грязный способ", он работает, а лучше пока нету...

Здрасьте. А предложенный тобою в третьем посте? Судия по всему, АИМП пользуется тем твоим, а не последним.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение VBTerminator » 03.04.2012 (Вт) 21:01

Кстати, функция RegisterHotKey может принимать и просто код клавиши безо всяких модификаторов (Ctrl, Alt, Shift и WinKey). Более того, в этом случае наша программа будет принимать нажатия любой кнопки как свои глобальные сочетания клавиш, не перебивая законный приёмник сообщений! Вот вам и кейлоггер. :twisted:

Добавлено: упс, пока печатал, в теме появилось ещё несколько ответов. Этот пост должен был идти сразу после моего предыдущего поста.
Последний раз редактировалось VBTerminator 03.04.2012 (Вт) 21:05, всего редактировалось 3 раз(а).

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 03.04.2012 (Вт) 21:01

Не, SetWindowPos, помогает только вытащить на поверхность, но фокус все равно остается на прежней программе. А моя форма просто начинает мигать (это при SetWindowPos).
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение ger_kar » 03.04.2012 (Вт) 21:06

VBTerminator писал(а):Хакер, зачем мучить человека страшными словами "отладка" и "ассемблер"?
Кстати меня такие слова никогда не пугали, наоборот чем то всегда завораживали и притягивали, может потому, что моим первым языком был язык машинных кодов (даже не ассемблер) еще под 8080 процессор.
Dependency Walker это конечно просто и достаточно удобно, но посидев пару тройку вечеров над изучением отладчика ollydbg и почитав материал по ссылкам которые я дал, можно потихоньку войти в такое увлекательное и совершенно не страшное дело как отладка. И не надо боятся, ничего страшного в ней нет, надо просто попробовать. И используя отладчик можно поставить бряк на соответствующее сообщение и от трассировать всю цепочку.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 21:11

Хакер писал(а):sosed213. Ты же нашёл способ с временным TOPMOST-ом. Полагаю, что и остальные «нарушители порядка» так делают.

Не делают они так. По крайней мере, большинство. А те кто делают, сразу заметны.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 03.04.2012 (Вт) 21:34

Стыдно обращаться, и просить :oops:

Давно ищу информацию, как перевести диск (HDD и USB Flash) в режим оффлайн?

Общию картину себе представляю так:
1. Открыть диск hDrive = CreateFile("\\.\PhysicalDrive0"...
2. Послать ему управляющий код DeviceIoControl (hDrive, IOCTL_DISK...)

Находил много статей, каждый описывает теорию, ну а толком ничего. есть похожий документированный IOCTL_VOLUME_OFFLINE, но это приминимо только для раздела (а нужен диск)

Есть 2 программы которые могут это сделать Diskpart (Select Disk N -> Offline Disk) и Диспетчер дисков.
Причем когда Diskpart переводит диск в режим Offline, то физически диск доступен на Read/Write, а через Диспетчер дисков только Read ('то документирована на Microsoft'e).


Вот, и хочу попросить ( :oops: ) у кого найдется чуток времени и желания пропустить Diskpart через дебагер, т.е. что он делает при отправке команды Offline Disk.

Заранее спасибо.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 05.04.2012 (Чт) 10:19

Дописал программу над которой долго работал :)

Программа для безопасного извлечения флешек и жестких дисков MyDisk v2.0

Изображение
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 06.04.2012 (Пт) 12:41

Ура!!! :)

Научился программно переводить диск в режим Online/Offline !!!!

Потом покажу, если кому надо будет.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Rody66 » 10.04.2012 (Вт) 11:05

Собственно, тоже встала задача показать окно, воспользовался данным кодом, но ничего у меня не вышло. Система Win 7.
Код: Выделить всё
Sub ShowWindow(hWnd As Long)
    Dim WinP As WINDOWPLACEMENT
    WinP.Length = Len(WinP)
    Call GetWindowPlacement(hWnd, WinP)
    WinP.Length = Len(WinP)
    WinP.flags = 0&
    WinP.showCmd = vbNormalFocus
    Call SetWindowPlacement(hWnd, WinP)
End Sub

Не уж то где то ошибку допустил?

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 10.04.2012 (Вт) 11:14

Когда мне показалось что этот вариант у меня заработал (проверял на работе), то это было не так (незнаю от чего тогда зависило), но дома у меня этот способ не стал работать.

Косяк из-за того что я пытался нажимать дважды Ctrl (как горячие клавиши моей программы), а то окно которое было активно в текущий момент, тоже обрабатывает каждое нажатие Ctrl, и поэтому не получается передать фокус своей программе.

Поэтому сменил сочетания клавишь на Ctrl+Win через RegisterHotKey/UnregisterHotKey, проблема ушла.

И показываю окно так:
Код: Выделить всё
    If Not (Me.WindowState = 0) Then Me.WindowState = 0
    Me.Show
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение Rody66 » 10.04.2012 (Вт) 11:44

sosed213, а смысл в таком способе?
У меня на Win 7 иконка окна просто начинает мигать на панели задач. А вот если сделать то самый грязный трюк:
Код: Выделить всё
    SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
    Me.Show
    SetWindowPos hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE

То окно хоть и будет мигать, зато вместе с этим будет еще и на переднем плане.
Что-то варианта кроме как определения left'a и top'a окна, после чего клика по ним, я пока не вижу. Хоть и, разумеется, ничего грязнее быть не может, тем не менее должно работать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение sosed213 » 10.04.2012 (Вт) 11:52

Я до этого тоже доходил, что вроде и форма уже спереди, но мигает. Тогда у меня и возникла идея посылать клик мышки в окно (чтобы ее активировать). Но это, вроде как, неправильно, и я ушел от этого способа.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.04.2012 (Вт) 19:39

Если проблема действительно в "активной обработке" (не знаю, как по-другому назвать), то просто используй таймер.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Отловить двойное нажатие Ctrl и передать форме фокус

Сообщение ark » 26.04.2012 (Чт) 11:34

Сперва окно восстанови в нормальное состояние
Код: Выделить всё
ShowWindow(me.hwnd,SW_RESTORE)
, а потом уже юзай SetForeground/Topmost etc. Иначе foreground'ом становится треевское окошко, потому и мигает.

Пред.

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

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

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

    TopList