Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1

Перемещение окна мышью за его заголовок с генерацией событий

05.11.2020, 12:08. Показов 1145. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день.

Используя обработку сообщений Windows при помощи WndProc генерирую события MouseMove. Обрабатывая эти события (при отключенной обработке Windows) перемещаю окно мышью за заголовок, всё работает, но при значительном смещение мыши, т.е. выходе курсора за пределы окна, генерация события не происходит. Оно и понятно, ведь окно в этом случае уже не получает сообщения от системы, т.к. курсор за его пределами. Для исключения этого момента решил осуществить захват мыши. Как только захватываю мышь Capture(True) с окном творится какая-то белеберда, при первом событии перемещения окно исчезает. Внимание вопрос: как правильно использовать захват мыши? Попутный вопрос: почему не прорисовывается форма при захвате мыши? Если можно, то с примерами кода.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2020, 12:08
Ответы с готовыми решениями:

Перемещение окна вслед за мышью, не за заголовок
#include<Windows.h> LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); HWND hWnd; char WinClass = "Window"; int WINAPI...

Перемещение окна приложения не за заголовок
как сделать, чтоб когда зажимаешь лкм на картинке(TImage) вся форма перетаскивалась, как будто перемещаешь зажав на заголовке окна?

Как узнать процесс выделенного окна и его заголовок
Делаю свой кейлогер очень надо!

4
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
05.11.2020, 19:27  [ТС]
Ну что, никто не знает?
Миниатюры
Перемещение окна мышью за его заголовок с генерацией событий  
0
3260 / 3293 / 556
Регистрация: 17.02.2019
Сообщений: 5,204
05.11.2020, 20:20
Uswer, топорно как то
VB.NET
1
2
3
4
Dim Z As Integer = 9
    Private Sub Form1_MouseLeave(sender As Object, e As System.EventArgs) Handles Me.MouseLeave
        Cursor.Clip = New Rectangle(Me.Location.X + Z, Me.Location.Y + Z, Me.Size.Width - (Z + 10), Me.Size.Height - (Z + 10))
    End Sub
если Z меньше или убрать то можно и размер формы изменить.
ну повторюсь топорно как то вышло
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
05.11.2020, 23:52  [ТС]
January29, а где здесь про захват мыши?
Чтобы была понятна суть происходящего урезанный код формы:
Кликните здесь для просмотра всего текста
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Imports System.Runtime.InteropServices
 
Public Class Form3
 
    Const WM_NCLBUTTONDOWN As Integer = &HA1
    Const WM_NCLBUTTONUP As Integer = &HA2
    Const WM_LBUTTONUP As Integer = &H202
 
    Const HTCAPTION As Integer = 2
 
    Dim fMove As Boolean 'флаг активности действия перемещения окна
    'разница координат me.Location и курсора мыши в начале действия перемещения окна
    Dim intDeltaX As Integer 'X координата 
    Dim intDeltaY As Integer 'Y координата 
 
 
    ''' <summary>
    ''' Обрабатывает клики мыши по неклиентской области окна
    ''' </summary>
    Private Sub WmNcMouseDown(ByRef m As System.Windows.Forms.Message, ByVal cButton As MouseButtons, ByVal clicks As Integer)
        Select Case m.WParam.ToInt32
            Case HTCAPTION
                'нажали в области заголовка
                If cButton = Windows.Forms.MouseButtons.Left AndAlso clicks = 1 Then
                    fMove = True 'устанавливаем флаг перемещения окна
                    Me.Capture = True 'захватываем мышь
                    'разница координат курсора мыши и положения окна в начале его перемещения
                    intDeltaX = LOWORD(m.LParam) - Me.Location.X
                    intDeltaY = HIWORD(m.LParam) - Me.Location.Y
                End If
                WmMouseDown(m, cButton, clicks) 'Генерирует событие MouseDown при нажатии кнопки мыши в области окна
            Case Else
                DefWndProc(m)
        End Select
    End Sub
 
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_NCLBUTTONDOWN
                'нажали левую кнопку мыши в неклиентской области окна
                WmNcMouseDown(m, Windows.Forms.MouseButtons.Left, 1)
            Case WM_NCLBUTTONUP
                'отпустили левую кнопку мыши в неклиентской области окна
                fMove = False ' снимаем флаг перемещения окна
                Me.Capture = False 'освобождаем мышь
            Case WM_LBUTTONUP
                'отпустили левую кнопку мыши в клиентской области окна
                fMove = False ' снимаем флаг перемещения окна
                Me.Capture = False 'освобождаем мышь
            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub
 
 
    Dim i As Integer 'счётчик перемещений
 
    Private Sub Form3_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If fMove Then
            i += 1
            Console.WriteLine("Move event: " & i.ToString)
            Dim newPosX As Integer = e.X - intDeltaX
            Dim newPosY As Integer = e.Y - intDeltaY
            Me.Location = New Point(newPosX, newPosY)
        Else
            i = 0
        End If
    End Sub
End Class

В коде убрана генерация события MouseMove, т.к. это вариант с захватом мыши. Как видно в окне вывода события MouseMove происходят, но с отображением окна проблема.
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
06.11.2020, 18:00  [ТС]
Люди, человеки!!! Научите использовать захват мыши применительно к форме. В частности как реализовать перетаскивание окна? Может вместо изменения Me.Location в обработчике Form3_MouseMove вызывать SendMessage с командой переноса окна?
Если сложно или не охота ткните носом в доступный материал. А то я в MSDN перечитал кучу всего, но так и не понял как это делается.

Добавлено через 7 минут
А и ещё вопросик: в справке написано "Если приложение обрабатывает это сообщение, оно должно вернуть ноль", правильно ли я понял, что после обработки сообщения надо сделать следующее
VB.NET
1
m.Result = System.IntPtr.Zero
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2020, 18:00
Помогаю со студенческими работами здесь

Определить заголовок(имя) окна, зная PID его процесса
Сабж! Уже 2ой день не могу найти - как? У меня известе PID и hwnd процесса, как узнать имя окна(то есть название окна, которое отображается...

Как при скриншоте окна подрезать его заголовок на разных компьютерах
Делаю скриншот окна игры, игра не фулскрин, на скриншоте мне нужна только рабочая область. Скриншот делаю через DwmGetWindowAttribute из-за...

Сформировать заголовок, отправить его, а затем принять ответный заголовок
День добрый, форумчане. Предо мной задача - сформировать заголовок, отправить его, а затем принять ответный заголовок. Первая часть...

Может ли оконная процедура различить, изменён ли размер окна функцией MoveWindow, или мышью за рамку окна?
Стиль WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_VISIBLE.

Перемещение Timage мышью
У меня на форме есть картинка как мне её перемещать мышкой? Заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru