С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
1

Как по дескриптору определить изменение курсора в чужих окнах?

14.11.2014, 13:16. Просмотров 1206. Ответов 23
Метки нет (Все метки)

Написал код перехвата вида курсора по дескриптору в локальном окне формы.
Как сделать тоже самое но за пределами окна (на чужих приложениях)?

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Form1
    Private Declare Function GetCursor Lib "user32" () As Long
 
    Private Curs As Long
 
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Application.DoEvents()
        Curs = GetCursor()
        Label1.Text = Curs
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = True
    End Sub
End Class
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2014, 13:16
Ответы с готовыми решениями:

Как по дескриптору определить размер окна в чужом приложении?
Здравствуйте! Друзья подскажите, как по дескриптору чужого окна можно...

Как отловить событие изменение вида курсора?
Здравствуйте друзья! Я новичок в VB.net. Подскажите, пожалуйста, как узнать ...

Как по дескриптору окна определить где на диске находится прога?
У меня такой вопрос. Как мне по хендлу(дескриптору) окна определить где на...

Нужно определить границы внутренней области окна по дескриптору
Нужно определить координаты внутренней облости окна относительно всего экрана...

Как сделать в Bash рандомное изменение координат курсора на экране каждые 5 минут?
Кто может набросать скриптик вот такой в баше? Добавлено через 6 минут Я...

23
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
16.11.2014, 10:36  [ТС] 2
Неужели ни кто не знает где в коде ошибка?
Почему за пределами формы не отлавливается дескрипт изменения курсора?
Вроде бы ATI функция "GetCursor()" написана правильно!
Помогите! Горю!
0
Yury Komar
Модератор
Эксперт .NET
2389 / 2195 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
16.11.2014, 13:35 3
Так а форма может быть твоя стоит OnTop поэтому и не ловит? А когда переходит в фон, то ловит. Незнаю. Надо испробоватт. Пока не у компа

Добавлено через 12 минут
А вообще чтото мне кажется что ты функцию Апишную под NET не подолгнал.
попробуй заменить свои "As Long" на "As Integer",
Мне кажется здесь проблема....
В VB.NET помоему уже нет APIшек с типом LONG...
Почитай про это...
а вообще, недавно пост один скинул сюда, глянь...
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
16.11.2014, 15:12  [ТС] 4
Yury Komar, спасибо за программу. Надеюсь она многим здорово поможет!
Измени код. Даже добавил стандартную функцию мыши за формой для определения дескрипта курсора при ее движении.
Все равно полный ноль! Как определялось внутри формы, так и определяется!
А надо за формой, в любом приложении.

vb.net
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
Public Class Form1
 
    Private Declare Function GetCursor Lib "user32.DLL" Alias "GetCursor" () As Integer
 
    Private Curs As Integer
    Dim Curs1 As Integer
 
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Application.DoEvents()
        Curs = GetCursor()
        Label1.Text = Curs
 
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = True
    End Sub
    Private Sub Form2_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
 
        'движение мыши за Формой
 
        Curs1 = GetCursor()
        Label2.Text = Curs1
 
    End Sub
End Class
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
16.11.2014, 18:40 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Да, действительно, в интернете я тоже не нашел никакой информации об отслеживании вида курсора за пределами своей формы. Только вопросы без ответов. В msdn функция GetCursorInfo описана для C++.
Вот рабочий код для VB.net.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Imports System.Runtime.InteropServices
Public Class Form1
 
    Private Declare Sub GetCursorInfo Lib "user32" (ByRef CurInfo As CURSORINFO)
 
    Private Structure CURSORINFO
        Dim cbSize As Int32
        Dim flags As Boolean
        Dim hCursor As IntPtr
        Dim ptScreenPos As Point
    End Structure
 
    Dim Cur As New CURSORINFO
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Cur.cbSize = Marshal.SizeOf(Cur)
        GetCursorInfo(Cur)
        Label1.Text = Cur.hCursor.ToString
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = True
    End Sub
End Class
3
Миниатюры
Как по дескриптору определить изменение курсора в чужих окнах?  
Yury Komar
Модератор
Эксперт .NET
2389 / 2195 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
16.11.2014, 19:24 6
SoftIce, работает...
оказывается не ту функцию пользовали ))))

А в чем же различия... зачем тогда GetCursor нужна
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
16.11.2014, 20:05 7
Цитата Сообщение от Yury Komar Посмотреть сообщение
А в чем же различия... зачем тогда GetCursor нужна
МСДН как бы намекает
Цитата Сообщение от msdn
GetCursor function

Retrieves a handle to the current cursor.

To get information on the global cursor, even if it is not owned by the current thread, use GetCursorInfo.
0
Yury Komar
Модератор
Эксперт .NET
2389 / 2195 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
16.11.2014, 20:36 8
Ааааа... ))))
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
17.11.2014, 06:06  [ТС] 9
SoftIce, ну ни фига себе! Здорово!!!
Я пол недели вокруг GetCursorInfo ходил. Все не мог допереть как через нее можно определить дескриптор курсора.
Огромное спасибо!!!!!!!
Раз уж Вы на ты с API, то может подскажите как здесь выявить совпадение с дескриптором указывающим на курсор "hand"!
Смысл такой: Подвести курсор к ссылке и при условии появления "Руки с пальчиком" отражается окно с кратким описанием.
Вот это условие мне и надо отследить.
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
17.11.2014, 09:20 10
А так не работает?
vb.net
1
If Cur.hCursor = 65581 Then Label2.Text = "Pyka" Else Label2.Text = "He pyka"
0
Yury Komar
Модератор
Эксперт .NET
2389 / 2195 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
17.11.2014, 10:14 11
SoftIce, помоему оно не может не работать )))
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
17.11.2014, 13:48 12
Цитата Сообщение от Edgar4 Посмотреть сообщение
Вроде бы ATI функция "GetCursor()" написана правильно!
Вероятно, что As Long - неверно. Должно быть As IntPtr.
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
17.11.2014, 13:52  [ТС] 13
SoftIce, Не работает!
У меня Cur.hCursor не 65581, а 65567.
Насколько я понимаю Cur.hCursor выдает дескриптор курсора, а он при перезапуску ОС постоянно новый.
Но вот, что странно!
Перезагрузил систему, Cur.hCursor остался тем же.
Это как понять?
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
17.11.2014, 14:15 14
Цитата Сообщение от Edgar4 Посмотреть сообщение
У меня Cur.hCursor не 65581, а 65567.
Ну так и ладно Значит у Вас не ХР, или курсор нестандартный.
Для ХР примерно такие цифры
'65581: 'Hand' cursor
'65555: I shape cursor
'65553: Arrow cursor
'65559: Cross cursor
'65557 Hourglass cursor

Можно еще попробовать определять вид курсора по дескриптору, типа так
vb.net
1
 Label2.Text = New Cursor(Cur.hCursor).ToString
Но этим способом распознаются не все курсоры, на непонятных выскакивает ошибка.
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
17.11.2014, 14:44  [ТС] 15
SoftIce, совершенно верно!
У меня windows 7.
А что такое?

'65581: 'Hand' cursor
'65555: I shape cursor
'65553: Arrow cursor
'65559: Cross cursor
'65557 Hourglass cursor

Если можно, дайте ссылку где можно это посмотреть.
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
17.11.2014, 14:57 16
Цитата Сообщение от Edgar4 Посмотреть сообщение
Если можно, дайте ссылку где можно это посмотреть.
Ничего толкового не нашел
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
17.11.2014, 15:17  [ТС] 17
SoftIce, так это что идентификаторы (ID) или дескрипт курсора?
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
17.11.2014, 15:48 18
Вообще-то дескриптор.

Добавлено через 3 минуты
Описание структуры в msdn
0
Edgar4
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 214
18.11.2014, 13:36  [ТС] 19
SoftIce, похоже это какие-то идентификаторы!

Для ХР примерно такие цифры
'65581: 'Hand' cursor
'65555: I shape cursor
'65553: Arrow cursor
'65559: Cross cursor
'65557 Hourglass cursor
Ведь пользователь пользуется не только XP, но и 7,8,9 ....
Весь интернет перевернул, информации 0!

Можно ли их определить программным путем?
0
SoftIce
es geht mir gut
10563 / 4080 / 1035
Регистрация: 27.07.2011
Сообщений: 9,993
Завершенные тесты: 1
18.11.2014, 18:12 20
Цитата Сообщение от Edgar4 Посмотреть сообщение
SoftIce, похоже это какие-то идентификаторы!
Да, похоже на то. Они наверняка описаны в каком-то системном файле, только вот в каком?
Пока сделал так. То есть заменил идентификаторы на свои(я думаю на ХР SP3 должно работать).
vb.net
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
Imports System.Runtime.InteropServices
Public Class Form1
 
    Private Declare Function GetCursorInfo Lib "user32" (ByRef CurInfo As CURSORINFO) As Boolean
 
    Private Structure CURSORINFO
        Dim cbSize As Integer
        Dim flags As Integer
        Dim hCursor As IDC_STANDARD_CURSORS
        Dim ptScreenPos As Point
    End Structure
 
    Dim Cur As New CURSORINFO
 
    Public Enum IDC_STANDARD_CURSORS
        IDC_ARROW = 65553 '32512
        IDC_IBEAM = 65555 '32513
        IDC_WAIT = 65557  '32514
        IDC_CROSS = 65559 '32515
        IDC_UPARROW = 32516
        IDC_SIZE = 219088139 '32640
        IDC_ICON = 32641
        IDC_SIZENWSE = 65563 ' 32642
        IDC_SIZENESW = 65565 '32643
        IDC_SIZEWE = 65567 '32644
        IDC_SIZENS = 65569 '32645
        IDC_SIZEALL = 32646
        IDC_NO = 32648
        IDC_HAND = 65581 '32649
        IDC_APPSTARTING = 32650
        IDC_HELP = 32651
    End Enum
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Cur.cbSize = Marshal.SizeOf(Cur)
        GetCursorInfo(Cur)
        Label1.Text = Cur.hCursor.ToString
        'Label2.Text = System.Windows.Forms.Cursor.Current.ToString
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Enabled = True
    End Sub
End Class
0
18.11.2014, 18:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2014, 18:12

Изменение цвета Label при наведении на него курсора мыши. Как это сделать?
Изменение цвета Label при наведении на него курсора мыши. Как это сделать?...

Как отключить изменение цвета рамки TextBox при наведении курсора/выделение его
При использовании *TextBoxName*.BorderBrush рамка окрашивается, но если навести...

Как узнать ID процесса (PID) по дескриптору окна (Handle)?
АП. Интересует как узнать PID по Handle.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru