Как определить, открыт "Пуск" или нет?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Как определить, открыт "Пуск" или нет?

Сообщение A.A.Z. » 26.03.2004 (Пт) 20:37

САБЖ, собсна.
Нет меня больше

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

Сообщение GSerg » 27.03.2004 (Сб) 7:34

An application sends a BM_GETSTATE message to determine the state of a button or check box.

BM_GETSTATE
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero

Parameters
This message has no parameters.

Return Values
The return value specifies the current state of the button. You can use the following bitmasks to extract information about the state:

  • 0x0003
    Specifies the check state (radio buttons and check boxes only).
  • BST_UNCHECKED
    indicates the button is unchecked
  • BST_CHECKED
    indicates the button is checked. A radio button is checked when it contains a dot; a check box is checked when it contains an X.
  • BST_INDETERMINATE
    indicates the check state is indeterminate (applies only if the button has the BS_3STATE or BS_AUTO3STATE style). A three-state check box is grayed when its state is indeterminate.
  • BST_CHECKED
    Indicates the button is checked
  • BST_FOCUS
    Specifies the focus state. A nonzero value indicates that the button has the keyboard focus
  • BST_INDETERMINATE
    Indicates the button is grayed because the state of the button is indeterminate. This value applies only if the button has the BS_3STATE or BS_AUTO3STATE style
  • BST_PUSHED
    Specifies the highlight state. A nonzero value indicates that the button is highlighted. A button is automatically highlighted when the user positions the cursor over it and presses and holds the left mouse button. The highlighting is removed when the user releases the mouse button
  • BST_UNCHECKED
    Indicates the button is unchecked. Same as the Windows NT return value of zero.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 27.03.2004 (Сб) 23:28

Пасибо, попробую.
Нет меня больше

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.03.2004 (Пн) 9:15

Только вот меню кнопки "Пуск" может быть открыто и при ненажатой кнопки "Пуск", такое извращение любят мышинные драйверы
Lasciate ogni speranza, voi ch'entrate.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 29.03.2004 (Пн) 19:41

А вот именно состояние Пуска можно определить? Пример GSerg'а, действительно, показывает состояние кнопки или флажка, а что же с Пуском? Дело ведь в том, что я делаю кнопку-замену Пуску, которая текущую кнопку просто убирает!
Нет меня больше

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 29.03.2004 (Пн) 22:26

А, ИМХО, придётся все мессаджи системные ловить, в ожидании нужного.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 30.03.2004 (Вт) 9:38

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

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 30.03.2004 (Вт) 15:38

GSerg
А что, уже можно на VB System Wide Hook делать? Или инжектить активикс длл?
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 30.03.2004 (Вт) 20:13

А можно ли так:
сразу после запуска на секунду открыть Пуск и получить его хендл,
затем по таймеру смотреть, IsWindowVisible(<hWnd пуска>),
если да - принять меры, если нет - тоже принять меры. :roll:
Нет меня больше

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

Сообщение GSerg » 31.03.2004 (Ср) 5:41

2 MEMBER
А нафига? Это же обычная кнопка, findwindowex на systray и всё...

2 A.A.Z.
А нафига? Кнопка видна всегда, её меню - нет, а вещи это разные.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 31.03.2004 (Ср) 12:21

А кто про кнопку говорит? Меню отследить надо.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

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

Сообщение GSerg » 31.03.2004 (Ср) 12:55

Так в том и прикол, что если на Пуск нажать, то он останется нажатым, пока меню отображается.
А вот отображается ли оно иными способами - того не ведаю :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 31.03.2004 (Ср) 16:00

Я, используя этот код (настряпал для наглядности) (на форме большой TextBox и Timer с интервалом в 1)
Код: Выделить всё
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Type POINTAPI
X As Long
Y As Long
End Type

Dim a As String

Sub Timer1_Timer()
Static OldHWnd As Long
Dim NewHWnd As Long
Dim Point As POINTAPI
Dim lClass As Long, sClass As String, Str As String

Str = Space(255)
GetCursorPos Point
DoEvents
NewHWnd = WindowFromPoint(Point.X, Point.Y)
DoEvents
If NewHWnd <> OldHWnd Then
sClass = Space(256)
lClass = GetClassName(NewHWnd, sClass, 256)
GetWindowText NewHWnd, Str, 255
Str = Left$(Str, InStr(Str, Chr$(0)) - 1)
Text1.Text = "hWnd = " & NewHWnd & Space(5) & "ClassName = " & Left$(sClass, lClass) & Space(5) & "Window Text: """ & Str & """" & vbCrLf & Text1.Text: OldHWnd = NewHWnd
End If
DoEvents
End Sub

прошелся по Пуску. Понял, что на нем много-много объектов класса SysListView, а в самом низу - ToolbarWindow32. Может, по нему смотреть?
Нет меня больше

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.04.2004 (Чт) 20:45

Не пойдёт по тулбару. Он ещё и в трее используется. И в приложениях, кстати, тоже.
Можно попробовать сделать так, смотреть сколько у окна SysListView, инкрементируя счётчик и если этот счётчик перевалит определённое значение, и если у окна есть ишшо и тулбар 32, то выплнять действие.
Хоть и крЫво это.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com


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

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

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

    TopList