Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Visual Basic

Ответ
 
Опции темы
Старый 21.08.2006, 14:47   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Перехват сообщений в VB.NET

Как и в С++ в Visual Basic .Net есть возможность оврабатывать сообщения Windows (WM). В классическом Visual Basic (6-й версии и ниже) был закрыт доступ к процедуре WndProc, которая отвечает за обработку WM. Для обработки конкретных сообщений служили так называемые "события" (Events) вызываемые готовой процедурой WndProc. В Visual Basic .Net все обстоит на много лучше. Так как форма является классом и программист имеет доступ к ее членам то можно легко перегрузить стандартную процедуру обработки сообщений и легко осуществлять их перехват.

В следующем примере я продемонстрирую не только как можно перехватить сообщение, но и использование такого замечательного класса как HashTable, который служит для хранения данных в формате Ключ - Значение, причем и ключ и значение могут быть любыми крассами. Работа этого класса основана на хэш-коде ключа, а следовательно есть ограничение: Ключь должен быть уникальным и не может повторятся. При добавлении нового элемента в хэш-таблицу с уже существующим ключем среда выдаст сообщение об ошибке.

Итак приступим.
1. Создайте новый проект Windows Application на Visual Basic .Net.
2. На созданной пучтой форме разместите элемент управления ListBox и назовите его lbMessages.
3. Откройте редактор кода формы и добавьте в разделе объявлений код:
Dim htMessages As New Hashtable
4. Далее создайте создайте процедуру для загрузки значений в хэш-таблицу. Ее код примерно следующий (значение констант я взял из заголовочного файла WinUser.h входящего в состав Visual Studio, он написан на С++):
    Private Sub BuildHashtable()
        htMessages.Add("0x0000", "WM_NULL")
        htMessages.Add("0x0001", "WM_CREATE")
        htMessages.Add("0x0002", "WM_DESTROY")
        htMessages.Add("0x0003", "WM_MOVE")
        htMessages.Add("0x0005", "WM_SIZE")
        htMessages.Add("0x0006", "WM_ACTIVATE")
        htMessages.Add("0x0007", "WM_SETFOCUS")
        htMessages.Add("0x0008", "WM_KILLFOCUS")
        htMessages.Add("0x000A", "WM_ENABLE")
        htMessages.Add("0x000B", "WM_SETREDRAW")
        htMessages.Add("0x000C", "WM_SETTEXT")
        htMessages.Add("0x000D", "WM_GETTEXT")
        htMessages.Add("0x000E", "WM_GETTEXTLENGTH")
        htMessages.Add("0x000F", "WM_PAINT")
        htMessages.Add("0x0010", "WM_CLOSE")
        htMessages.Add("0x0011", "WM_QUERYENDSESSION")
        htMessages.Add("0x0013", "WM_QUERYOPEN")
        htMessages.Add("0x0016", "WM_ENDSESSION")
        htMessages.Add("0x0012", "WM_QUIT")
        htMessages.Add("0x0014", "WM_ERASEBKGND")
        htMessages.Add("0x0015", "WM_SYSCOLORCHANGE")
        htMessages.Add("0x0018", "WM_SHOWWINDOW")
        htMessages.Add("0x001A", "WM_WININICHANGE")
        htMessages.Add("0x001B", "WM_DEVMODECHANGE")
        htMessages.Add("0x001C", "WM_ACTIVATEAPP")
        htMessages.Add("0x001D", "WM_FONTCHANGE")
        htMessages.Add("0x001E", "WM_TIMECHANGE")
        htMessages.Add("0x001F", "WM_CANCELMODE")
        htMessages.Add("0x0020", "WM_SETCURSOR")
        htMessages.Add("0x0021", "WM_MOUSEACTIVATE")
        htMessages.Add("0x0022", "WM_CHILDACTIVATE")
        htMessages.Add("0x0023", "WM_QUEUESYNC")
        htMessages.Add("0x0024", "WM_GETMINMAXINFO")
        htMessages.Add("0x0026", "WM_PAINTICON")
        htMessages.Add("0x0027", "WM_ICONERASEBKGND")
        htMessages.Add("0x0028", "WM_NEXTDLGCTL")
        htMessages.Add("0x002A", "WM_SPOOLERSTATUS")
        htMessages.Add("0x002B", "WM_DRAWITEM")
        htMessages.Add("0x002C", "WM_MEASUREITEM")
        htMessages.Add("0x002D", "WM_DELETEITEM")
        htMessages.Add("0x002E", "WM_VKEYTOITEM")
        htMessages.Add("0x002F", "WM_CHARTOITEM")
        htMessages.Add("0x0030", "WM_SETFONT")
        htMessages.Add("0x0031", "WM_GETFONT")
        htMessages.Add("0x0032", "WM_SETHOTKEY")
        htMessages.Add("0x0033", "WM_GETHOTKEY")
        htMessages.Add("0x0037", "WM_QUERYDRAGICON")
        htMessages.Add("0x0039", "WM_COMPAREITEM")
        htMessages.Add("0x003D", "WM_GETOBJECT")
        htMessages.Add("0x0041", "WM_COMPACTING")
        htMessages.Add("0x0044", "WM_COMMNOTIFY")
        htMessages.Add("0x0046", "WM_WINDOWPOSCHANGING")
        htMessages.Add("0x0047", "WM_WINDOWPOSCHANGED")
        htMessages.Add("0x0048", "WM_POWER")
        htMessages.Add("0x004A", "WM_COPYDATA")
        htMessages.Add("0x004B", "WM_CANCELJOURNAL")
        htMessages.Add("0x004E", "WM_NOTIFY")
        htMessages.Add("0x0050", "WM_INPUTLANGCHANGEREQUEST")
        htMessages.Add("0x0051", "WM_INPUTLANGCHANGE")
        htMessages.Add("0x0052", "WM_TCARD")
        htMessages.Add("0x0053", "WM_HELP")
        htMessages.Add("0x0054", "WM_USERCHANGED")
        htMessages.Add("0x0055", "WM_NOTIFYFORMAT")
        htMessages.Add("0x007B", "WM_CONTEXTMENU")
        htMessages.Add("0x007C", "WM_STYLECHANGING")
        htMessages.Add("0x007D", "WM_STYLECHANGED")
        htMessages.Add("0x007E", "WM_DISPLAYCHANGE")
        htMessages.Add("0x007F", "WM_GETICON")
        htMessages.Add("0x0080", "WM_SETICON")
        htMessages.Add("0x0081", "WM_NCCREATE")
        htMessages.Add("0x0082", "WM_NCDESTROY")
        htMessages.Add("0x0083", "WM_NCCALCSIZE")
        htMessages.Add("0x0084", "WM_NCHITTEST")
        htMessages.Add("0x0085", "WM_NCPAINT")
        htMessages.Add("0x0086", "WM_NCACTIVATE")
        htMessages.Add("0x0087", "WM_GETDLGCODE")
        htMessages.Add("0x0088", "WM_SYNCPAINT")
        htMessages.Add("0x00A0", "WM_NCMOUSEMOVE")
        htMessages.Add("0x00A1", "WM_NCLBUTTONDOWN")
        htMessages.Add("0x00A2", "WM_NCLBUTTONUP")
        htMessages.Add("0x00A3", "WM_NCLBUTTONDBLCLK")
        htMessages.Add("0x00A4", "WM_NCRBUTTONDOWN")
        htMessages.Add("0x00A5", "WM_NCRBUTTONUP")
        htMessages.Add("0x00A6", "WM_NCRBUTTONDBLCLK")
        htMessages.Add("0x00A7", "WM_NCMBUTTONDOWN")
        htMessages.Add("0x00A8", "WM_NCMBUTTONUP")
        htMessages.Add("0x00A9", "WM_NCMBUTTONDBLCLK")
        htMessages.Add("0x00AB", "WM_NCXBUTTONDOWN")
        htMessages.Add("0x00AC", "WM_NCXBUTTONUP")
        htMessages.Add("0x00AD", "WM_NCXBUTTONDBLCLK")
        htMessages.Add("0x00FF", "WM_INPUT")
        htMessages.Add("0x0100", "WM_KEYDOWN")
        htMessages.Add("0x0101", "WM_KEYUP")
        htMessages.Add("0x0102", "WM_CHAR")
        htMessages.Add("0x0103", "WM_DEADCHAR")
        htMessages.Add("0x0104", "WM_SYSKEYDOWN")
        htMessages.Add("0x0105", "WM_SYSKEYUP")
        htMessages.Add("0x0106", "WM_SYSCHAR")
        htMessages.Add("0x0107", "WM_SYSDEADCHAR")
        htMessages.Add("0x0109", "WM_KEYLAST")
        htMessages.Add("0x0108", "WM_KEYLAST")
        htMessages.Add("0x0110", "WM_INITDIALOG")
        htMessages.Add("0x0111", "WM_COMMAND")
        htMessages.Add("0x0112", "WM_SYSCOMMAND")
        htMessages.Add("0x0113", "WM_TIMER")
        htMessages.Add("0x0114", "WM_HSCROLL")
        htMessages.Add("0x0115", "WM_VSCROLL")
        htMessages.Add("0x0116", "WM_INITMENU")
        htMessages.Add("0x0117", "WM_INITMENUPOPUP")
        htMessages.Add("0x011F", "WM_MENUSELECT")
        htMessages.Add("0x0120", "WM_MENUCHAR")
        htMessages.Add("0x0121", "WM_ENTERIDLE")
        htMessages.Add("0x0122", "WM_MENURBUTTONUP")
        htMessages.Add("0x0123", "WM_MENUDRAG")
        htMessages.Add("0x0124", "WM_MENUGETOBJECT")
        htMessages.Add("0x0125", "WM_UNINITMENUPOPUP")
        htMessages.Add("0x0126", "WM_MENUCOMMAND")
        htMessages.Add("0x0127", "WM_CHANGEUISTATE")
        htMessages.Add("0x0128", "WM_UPDATEUISTATE")
        htMessages.Add("0x0129", "WM_QUERYUISTATE")
        htMessages.Add("0x0132", "WM_CTLCOLORMSGBOX")
        htMessages.Add("0x0133", "WM_CTLCOLOREDIT")
        htMessages.Add("0x0134", "WM_CTLCOLORLISTBOX")
        htMessages.Add("0x0135", "WM_CTLCOLORBTN")
        htMessages.Add("0x0136", "WM_CTLCOLORDLG")
        htMessages.Add("0x0137", "WM_CTLCOLORSCROLLBAR")
        htMessages.Add("0x0138", "WM_CTLCOLORSTATIC")
        htMessages.Add("0x0200", "WM_MOUSEMOVE")
        htMessages.Add("0x0201", "WM_LBUTTONDOWN")
        htMessages.Add("0x0202", "WM_LBUTTONUP")
        htMessages.Add("0x0203", "WM_LBUTTONDBLCLK")
        htMessages.Add("0x0204", "WM_RBUTTONDOWN")
        htMessages.Add("0x0205", "WM_RBUTTONUP")
        htMessages.Add("0x0206", "WM_RBUTTONDBLCLK")
        htMessages.Add("0x0207", "WM_MBUTTONDOWN")
        htMessages.Add("0x0208", "WM_MBUTTONUP")
        htMessages.Add("0x0209", "WM_MBUTTONDBLCLK")
        htMessages.Add("0x020A", "WM_MOUSEWHEEL")
        htMessages.Add("0x020D", "WM_MOUSELAST")
        htMessages.Add("0x0210", "WM_PARENTNOTIFY")
        htMessages.Add("0x0211", "WM_ENTERMENULOOP")
        htMessages.Add("0x0212", "WM_EXITMENULOOP")
        htMessages.Add("0x0213", "WM_NEXTMENU")
        htMessages.Add("0x0214", "WM_SIZING")
        htMessages.Add("0x0215", "WM_CAPTURECHANGED")
        htMessages.Add("0x0216", "WM_MOVING")
        htMessages.Add("0x0218", "WM_POWERBROADCAST")
        htMessages.Add("0x0219", "WM_DEVICECHANGE")
        htMessages.Add("0x0220", "WM_MDICREATE")
        htMessages.Add("0x0221", "WM_MDIDESTROY")
        htMessages.Add("0x0222", "WM_MDIACTIVATE")
        htMessages.Add("0x0223", "WM_MDIRESTORE")
        htMessages.Add("0x0224", "WM_MDINEXT")
        htMessages.Add("0x0225", "WM_MDIMAXIMIZE")
        htMessages.Add("0x0226", "WM_MDITILE")
        htMessages.Add("0x0227", "WM_MDICASCADE")
        htMessages.Add("0x0228", "WM_MDIICONARRANGE")
        htMessages.Add("0x0229", "WM_MDIGETACTIVE")
        htMessages.Add("0x0230", "WM_MDISETMENU")
        htMessages.Add("0x0231", "WM_ENTERSIZEMOVE")
        htMessages.Add("0x0232", "WM_EXITSIZEMOVE")
        htMessages.Add("0x0233", "WM_DROPFILES")
        htMessages.Add("0x0234", "WM_MDIREFRESHMENU")
        htMessages.Add("0x0281", "WM_IME_SETCONTEXT")
        htMessages.Add("0x0282", "WM_IME_NOTIFY")
        htMessages.Add("0x0283", "WM_IME_CONTROL")
        htMessages.Add("0x0284", "WM_IME_COMPOSITIONFULL")
        htMessages.Add("0x0285", "WM_IME_SELECT")
        htMessages.Add("0x0286", "WM_IME_CHAR")
        htMessages.Add("0x0288", "WM_IME_REQUEST")
        htMessages.Add("0x0290", "WM_IME_KEYDOWN")
        htMessages.Add("0x0291", "WM_IME_KEYUP")
        htMessages.Add("0x02A1", "WM_MOUSEHOVER")
        htMessages.Add("0x02A3", "WM_MOUSELEAVE")
        htMessages.Add("0x02A0", "WM_NCMOUSEHOVER")
        htMessages.Add("0x02A2", "WM_NCMOUSELEAVE")
        htMessages.Add("0x02B1", "WM_WTSSESSION_CHANGE")
        htMessages.Add("0x02C0", "WM_TABLET_FIRST")
        htMessages.Add("0x02DF", "WM_TABLET_LAST")
        htMessages.Add("0x0300", "WM_CUT")
        htMessages.Add("0x0301", "WM_COPY")
        htMessages.Add("0x0302", "WM_PASTE")
        htMessages.Add("0x0303", "WM_CLEAR")
        htMessages.Add("0x0304", "WM_UNDO")
        htMessages.Add("0x0305", "WM_RENDERFORMAT")
        htMessages.Add("0x0306", "WM_RENDERALLFORMATS")
        htMessages.Add("0x0307", "WM_DESTROYCLIPBOARD")
        htMessages.Add("0x0308", "WM_DRAWCLIPBOARD")
        htMessages.Add("0x0309", "WM_PAINTCLIPBOARD")
        htMessages.Add("0x030A", "WM_VSCROLLCLIPBOARD")
        htMessages.Add("0x030B", "WM_SIZECLIPBOARD")
        htMessages.Add("0x030C", "WM_ASKCBFORMATNAME")
        htMessages.Add("0x030D", "WM_CHANGECBCHAIN")
        htMessages.Add("0x030E", "WM_HSCROLLCLIPBOARD")
        htMessages.Add("0x030F", "WM_QUERYNEWPALETTE")
        htMessages.Add("0x0310", "WM_PALETTEISCHANGING")
        htMessages.Add("0x0311", "WM_PALETTECHANGED")
        htMessages.Add("0x0312", "WM_HOTKEY")
        htMessages.Add("0x0317", "WM_PRINT")
        htMessages.Add("0x0318", "WM_PRINTCLIENT")
        htMessages.Add("0x0319", "WM_APPCOMMAND")
        htMessages.Add("0x031A", "WM_THEMECHANGED")
        htMessages.Add("0x0358", "WM_HANDHELDFIRST")
        htMessages.Add("0x035F", "WM_HANDHELDLAST")
        htMessages.Add("0x0360", "WM_AFXFIRST")
        htMessages.Add("0x037F", "WM_AFXLAST")
        htMessages.Add("0x0380", "WM_PENWINFIRST")
        htMessages.Add("0x038F", "WM_PENWINLAST")
        htMessages.Add("0x8000", "WM_APP")
        htMessages.Add("0x0400", "WM_USER")
    End Sub
5. Процедуру приведенную выше необходимо вызвать при создании формы. Для этого щелкните по форме дважды и в редакторе кода появится обработчик события загрузки формы. Добавьте в него вызов процедуры BuildHashtable():
    Private Sub MainForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BuildHashtable()
    End Sub
6. И наконец мы дошли до самого главного: до перехвата сообщений. Как я говорил раньше для этого нужно перегрузить процедуру WndProc. Далается это следующим образом:
а) В редакторе кода формы в левом выпадающем списке выберете пункт Переопределения (Overrides) как показано на следующей картинке:

б) В правом выпадающем списке самым последним элементом будет WndProc, которая нам и нужна. Щелкнув на ней автоматически будет создана процедура, перегружающая стандартную WndProc:

В нее добавьте следующий код:
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim s As String

        s = "0x" + String.Format("{0:X4}", m.Msg)

        lbMessages.Items.Add(s + "   " + htMessages(s))
        MyBase.WndProc(m)
    End Sub
Так как у нас в хэш-таблице ключи имеют шеснадцатеричный формат, то нам необходимо отформатировать полученное сообщение (привести к формату 0xXXXX). Это делается следующей строчкой кода вышеприведенной процедуры:
s = "0x" + String.Format("{0:X4}", m.Msg)
Далее добавим в список значение подученного сообщения и его название, которое возьмем из хэш таблицы:
lbMessages.Items.Add(s + "   " + htMessages(s))
Так как в этом примере мы не будем сами обрабатывать сообщения, а только посмотрим как осуществляется их перехват, то чтобы наще приложение не "зависло" в перегруженной процедуре необходимо вызвать стандартный обработчик сообщений нашей формы и передать ему в качестве параметра полученное сообщение:
MyBase.WndProc(m)
Вот и все! Желаю удачи!

PS: В аттаче прикреплен проект с исходниками написанный на VB.NET 2003 для этой статьи.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 15.06.2007, 16:56   #2
ps
AnyKey`щик
 
Регистрация: 12.06.2007
Сообщений: 1
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Перехват сообщений в VB.NET

Если бы так же просто можно было перехватывать сообщения чужим окнам, что б не ставить хуки...
(Offline)
 
Ответить с цитированием
Старый 28.06.2007, 00:31   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: Перехват сообщений в VB.NET

Используя System.Windows.Form.NativeWindow класс можно вполне нормально перехватывать сообщения других форм, правда я незнаю используются для этого хуки или нет...

Пример прилагается
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Резидентный перехватчик клавиатуры SubZer0 Delphi 10 22.08.2007 17:32
Объединение сообщений Magus Баги 2 26.04.2007 01:04
Обзор сообщений axel186 2D-программирование 7 06.04.2007 01:26
программка для отсылки сообщении zalim2010 JAVA Micro Edition 0 16.03.2007 15:57
Отправка сообщений на короткий номер dermeg Основной форум 5 08.09.2006 01:20


Часовой пояс GMT +4, время: 09:47.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com