Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 77.


VBNet VBMania
Голосование:

Ваш голос отсылается по E-mail владельцу сайта, после чего голоса анализируются и на отдельной странице выводятся результаты.

Нет тем.

Рассылки Subscribe.Ru
Мир программирования на Visual BASIC 5.0 и HTML.
Новости сайта IgorykSoft и советы по программированию


Рассылки Subscribe.Ru
Старые игры

Доска почёта:

Sergey Y. Tkachev
Кононенко Роман
Kirill

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Новый выпуск...
    Читайте!


    Содержание выпуска




    Книги

    Переход на VB .NET. Стратегии, концепции, код (цена ~ 158 руб.)

    Эта книга была задумана как одна из первых книг о .NET, которая ознакомит читателя с основными идеями новой архитектуры и подготовит его к знакомству с более детальной литературой, например документацией Microsoft и ее толкованиями, которая неизбежно появится на рынке. Она поможет вам взглянуть на эту технологию с позиций ваших собственных рабочих планов и быстро освоить те концепции, которые покажутся необычными для большинства прогр...

    Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.


    Программирование на VB.NET. Учебный курс (цена ~ 119 руб.)

    Эта книга является вводным курсом по изучению языка программирования Visual Basic .NET. Даны основные принципы объектно-ориентированного программирования в контексте языка VB .NET, поскольку без хорошей подготовки в этой области невозможно в полной мере пользоваться всеми преимуществами VB .NET.
    Изложены азы всех аспектов языка, которыми должен владеть любой профессиональный разработчик VB .NET

    Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.


    VB.NET для разработчиков (цена ~ 125 руб.)

    Основная задача книги - быстро ознакомить разработчиков Visual Basic с изменениями в .NET Framework. Программисты, использующие Java, C++, Delphi или другие инструменты разработки приложений и интересующиеся Visual Basic или технологией .NET Framework, также найдут эту книгу полезной. Хотя книга посвящена Visual Basic.NET, ее основная цель - продемонстрировать взаимодействие Visual Basic и ...

    Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.




    Остальные книги о VB можно найти
    здесь.

    наверх


    Получение имен классов и всех заголовков активных окон

    Даный пример покажет в окне Debug информацию о классе окон открытых приложений и текст заголовков всех активных окон

    Private Declare Function apiGetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassname As String, ByVal nMaxCount As Long) As Long
    Private Declare Function apiGetDesktopWindow Lib "user32" Alias "GetDesktopWindow" () As Long
    Private Declare Function apiGetWindow Lib "user32" Alias "GetWindow" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function apiGetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function apiGetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal aint As Long) As Long
    Private Const mcGWCHILD = 5
    Private Const mcGWHWNDNEXT = 2
    Private Const mcGWLSTYLE = (-16)
    Private Const mcWSVISIBLE = &H10000000
    Private Const mconMAXLEN = 255
    Function fEnumWindows()
    Dim lngx As Long, lngLen As Long
    Dim lngStyle As Long, strCaption As String
    lngx = apiGetDesktopWindow()
    'Return the first child to Desktop
    lngx = apiGetWindow(lngx, mcGWCHILD)
    Do While Not lngx = 0
    strCaption = fGetCaption(lngx)
    If Len(strCaption) > 0 Then
    lngStyle = apiGetWindowLong(lngx, mcGWLSTYLE)
    'enum visible windows only
    If lngStyle And mcWSVISIBLE Then
    Debug.Print "Class = " & fGetClassName(lngx),
    Debug.Print "Caption = " & fGetCaption(lngx)
    End If
    End If
    lngx = apiGetWindow(lngx, mcGWHWNDNEXT)
    Loop
    End Function
    Private Function fGetClassName(Hwnd As Long)
    Dim strBuffer As String
    Dim intCount As Integer
    strBuffer = String$(mconMAXLEN - 1, 0)
    intCount = apiGetClassName(Hwnd, strBuffer, mconMAXLEN)
    If intCount > 0 Then
    fGetClassName = Left$(strBuffer, intCount)
    End If
    End Function
    Private Function fGetCaption(Hwnd As Long)
    Dim strBuffer As String
    Dim intCount As Integer
    strBuffer = String$(mconMAXLEN - 1, 0)
    intCount = apiGetWindowText(Hwnd, strBuffer, mconMAXLEN)
    If intCount > 0 Then
    fGetCaption = Left$(strBuffer, intCount)
    End If
    End Function
    Private Sub Form_Load()
    Call fEnumWindows
    End Sub

    наверх


    Найти любое окно

    Данный пример покажет, как можно по любому куску текста заголовка определить номер процесса в системе, и по этому номеру можно определить полный заголовок окна

    Option Explicit
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
    Public Function GetCaption(lhWnd As Long) As String
    Dim sA As String, lLen As Long
    lLen = GetWindowTextLength(lhWnd)
    sA = String(lLen, 0)
    Call GetWindowText(lhWnd, sA, lLen + 1)
    GetCaption = sA
    End Function
    Public Function DLHFindWin(frm As Form, WinTitle As String, CaseSensitive As Boolean) As Long
    Dim lhWnd As Long, sA As String
    lhWnd = frm.hwnd
    Do
    DoEvents
    If lhWnd = 0 Then Exit Do
    If CaseSensitive = False Then
    sA = LCase(GetCaption(lhWnd))
    WinTitle = LCase(WinTitle)
    Else
    sA = GetCaption(lhWnd)
    End If
    If InStr(sA, WinTitle) Then
    DLHFindWin = lhWnd
    Exit Do
    Else
    DLHFindWin = 0
    End If
    lhWnd = GetNextWindow(lhWnd, 2)
    Loop
    End Function

    Private Sub Form_Load()
    'вместо слова internet напиши любое слово или выражение,
    'содержащее в заголовке окна, которое вы ищете
    Call MsgBox(DLHFindWin(Me, "internet", False))
    Call MsgBox(GetCaption(DLHFindWin(Me, "internet", False)))
    'ПРИМЕЧАНИЕ: вы можете использовать в вашей программе как первую, так и вторую строку
    End Sub

    наверх


    Заблокировать/Разблокировать любое окно в Win95/98/NT

    Расположите на форме 2 элемента CommandButton. В коде 'Call DisWin("Form1", ...)' замените "Form1" на требуемое окно. После нажатия на кнопку в данном окне блокируются нажатия на кнопки мыши и клавиатуры. Но вы можете поставить таймер на 20 секунд и вписать в событие Timer1_Timer() код из второй кнопки.

    #If Win32 Then
    Private Declare Function EnableWindow& Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Long)
    Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
    #Else
    Private Declare Function EnableWindow% Lib "user" (ByVal hWnd As Integer, ByVal aBOOL As Integer)
    Private Declare Function FindWindow% Lib "user" (ByVal lpClassName As Any, ByVal lpWindowName As Any)
    #End If
    Function DisWin(WindowName$, EnabOrDisab&) 'EX: Call DisWin("mIRC32", 0)
    Dim lFndWnd As Long
    Dim lDisEnWnd As Long
    lFndWnd = FindWindow(vbNullString, WindowName$) 'Finds the Window Name
    lDisEnWnd = EnableWindow(lFndWnd, ByVal EnabOrDisab&) 'Disables all mouse and keyboard input to the specified window.
    'In ByVal EnabOrDisab& you either enter: 0 to Disable Window or 1 to Enable it.
    End Function
    Private Sub Command1_Click()
    Call DisWin("Form1", 0)
    End Sub
    Private Sub Command2_Click()
    Call DisWin("Form1", 1)
    End Sub

    наверх


    Поиск hwnd процесса на панели задач

    Данный пример покажет hwnd процесса, представленного на панели задач. В качестве входного параметра можно задавать шаблон для поиска. Честно говоря, я не совсем разобрался, как написать шаблон, однако если вам пример понравится, можете сами разобраться.

    Обязательно добавьте модуль в ваш проект. Расположите на форме элемент CommandButton.

    'КОД ФОРМЫ

    Private Sub Command1_Click()
    Debug.Print FindWindowWild("*Mi??OSoFt In[s-u]ernet*", False)
    End Sub

    'КОД МОДУЛЯ

    Private Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam 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 Declare Function IsWindowVisible& Lib "user32" (ByVal hwnd As Long)
    Private Declare Function GetParent& Lib "user32" (ByVal hwnd As Long)
    Dim sPattern As String, hFind As Long

    Function EnumWinProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim k As Long, sName As String
    If IsWindowVisible(hwnd) And GetParent(hwnd) = 0 Then
    sName = Space$(128)
    k = GetWindowText(hwnd, sName, 128)
    If k > 0 Then
    sName = Left$(sName, k)
    If lParam = 0 Then sName = UCase(sName)
    If sName Like sPattern Then
    hFind = hwnd
    EnumWinProc = 0
    Exit Function
    End If
    End If
    End If
    EnumWinProc = 1
    End Function

    Public Function FindWindowWild(sWild As String, Optional bMatchCase As Boolean = True) As Long
    sPattern = sWild
    If Not bMatchCase Then sPattern = UCase(sPattern)
    EnumWindows AddressOf EnumWinProc, bMatchCase
    FindWindowWild = hFind
    End Function

    наверх


    Получение полного пути exe-файла из его хэндла

    Данный пример покажет полный путь к исполняемому (exe) файлу.

    Расположите на форме элемент CommandButton. В оригинальном примере в событии Command1_Click() была лишь одна строчка (та, которая не закомментирована). Но если вы добавите модуль из примера "Поиск hwnd процесса на панели задач", то вы сможете определить полный путь exe-файла программы ИнтернетЭкспорер. Не забудьте снять комментарий в событии Command1_Click().

    Const TH32CS_SNAPPROCESS As Long = 2&
    Const MAX_PATH As Long = 260

    Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwflags As Long
    szexeFile As String * MAX_PATH
    End Type

    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlgas As Long, ByVal lProcessID As Long) As Long
    Private Declare Function ProcessFirst Lib "Kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function ProcessNext Lib "Kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)

    Public Function GetExeFromHandle(hwnd As Long) As String
    Dim threadID As Long, processID As Long, hSnapshot As Long
    Dim uProcess As PROCESSENTRY32, rProcessFound As Long
    Dim i As Integer, szExename As String
    ' Get ID for window thread
    threadID = GetWindowThreadProcessId(hwnd, processID)
    ' Check if valid
    If threadID = 0 Or processID = 0 Then Exit Function
    ' Create snapshot of current processes
    hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
    ' Check if snapshot is valid
    If hSnapshot = -1 Then Exit Function
    'Initialize uProcess with correct size
    uProcess.dwSize = Len(uProcess)
    'Start looping through processes
    rProcessFound = ProcessFirst(hSnapshot, uProcess)
    Do While rProcessFound
    If uProcess.th32ProcessID = processID Then
    'Found it, now get name of exefile
    i = InStr(1, uProcess.szexeFile, Chr(0))
    If i > 0 Then szExename = Left$(uProcess.szexeFile, i - 1)
    Exit Do
    Else
    'Wrong ID, so continue looping
    rProcessFound = ProcessNext(hSnapshot, uProcess)
    End If
    Loop
    Call CloseHandle(hSnapshot)
    GetExeFromHandle = szExename
    End Function

    Private Sub Command1_Click()
    'снимите комментарий, если вы добавили модуль из предыдущего примера
    'MsgBox GetExeFromHandle(FindWindowWild("*Mi??OSoFt In[s-u]ernet*", False))
    MsgBox GetExeFromHandle(Me.hwnd)
    End Sub

    наверх


    Использование анимационного курсора

    Добавьте 2 CommandButton на форму

    'ПРИМЕР 1

    Const GCL_HCURSOR = -12
    Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long
    Private Declare Function DestroyCursor Lib "user32" (ByVal hCursor As Any) As Long
    Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
    Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Dim lResult As Long
    Dim mhAniCursor As Long
    Dim mhAniCursor2 As Long
    Private Sub Command1_Click()
    'Replace 'C:\windows\cursors\hourglas.ani' with your ANI Cursor
    mhAniCursor = LoadCursorFromFile("C:\windows\cursors\hourglas.ani")
    lResult = SetClassLong((hwnd), GCL_HCURSOR, mhAniCursor)
    End Sub
    Private Sub Command2_Click()
    lResult = SetClassLong((hwnd), GCL_HCURSOR, mhBaseCursor)
    lResult = DestroyCursor(mhAniCursor)
    End Sub
    Private Sub Form_Load()
    mhBaseCursor = GetClassLong((hwnd), GCL_HCURSOR)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    lResult = SetClassLong((hwnd), GCL_HCURSOR, mhBaseCursor)
    lResult = DestroyCursor(mhAniCursor)
    End Sub

    'ПРИМЕР 2

    Private Declare Function CopyCursor Lib "user32" Alias "CopyIcon" (ByVal hcur As Long) As Long
    Private Declare Function GetCursor Lib "user32" () As Long
    Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
    Private Declare Function SetSystemCursor Lib "user32" (ByVal hcur As Long, ByVal id As Long) As Long
    Private Const OCR_NORMAL = 32512
    Dim hCursor As Long, hOldCursor As Long

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If hCursor = 0 Then
    Dim lRet As Long, a As String, hInstance As Long, hImage As Long
    'укажите правильную директорию Windows
    a = "c:\win\cursors\" & Dir$("c:\win\cursors\*.ani")
    hCursor = LoadCursorFromFile(a)
    If hCursor Then
    lRet = GetCursor()
    hOldCursor = CopyCursor(lRet)
    lRet = SetSystemCursor(hCursor, OCR_NORMAL)
    End If
    End If
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    Dim lRet As Long
    If hCursor Then
    lRet = SetSystemCursor(hOldCursor, OCR_NORMAL)
    End If
    End Sub

    наверх


    Мои программы

    BalloonMessage for MS Agent

       BalloonMessage for Microsoft Agent реализует диалог программы с пользователем, используя при этом технологию Microsoft Agent. OCX реализует три типа диалоговых окон: InputBox, MsgBox и MsgLabels.

    Автор: Шатрыкин Иван. Соавтор: Павел Сурменок.

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса:
    Max

    Ответ ожидается по этому адресу

       Как прекрепить к проэкту ещё одну форму, и как Сделать так чтоб InputBox реагировал на ввод данных, и как изменить в свойствх программы "ПРОИЗВОДИТЕЛЯ"?


    Автор вопроса: Костик

    Ответ ожидается по этому адресу

       Вопрос 1:
    Как сделать так чтобы ия папки VB60, где лежит моя прога яапускающая help.hlp файл, открывался help.hlp файл?
    Вопрос 2:
    Как можно уянать что делает какой-либо dll файл?


    Автор вопроса: Шевченко Александр

    Ответ ожидается по этому адресу

       Как программно вложить файл в письмо?


    Автор вопроса: Иван

    Ответ ожидается по этому адресу

       Как узнать (программно) где лежит шаблон Normal.dot в Office 97/2000 ?


    Автор вопроса: Иван

    Ответ ожидается по этому адресу

       Как из программы на VB отправить документ Word на печать ?


    Автор вопроса: Vlad

    Ответ ожидается по этому адресу

       помогите составить оптимальный алгоритм создания дерева (treeviewer)из таблицы, в которой два основных поля - ссылка на верхний и нижний узел ( rec_up,rec_down )


    Автор вопроса: Вадим

    Ответ ожидается по этому адресу

       VB. Как писать в определенное место файла? Типа патч.
    Как найти файл и проверить (сравнить) дату и изменить ее по своему желанию?


    Автор вопроса: Ilja A. Bakhtin

    Ответ ожидается по этому адресу

       Как сделать так, чтобы программа работала в ДОСовском окне.


    Автор вопроса: daedmen

    Ответ ожидается по этому адресу

       Народ подскажите плиз как считать/записать в файл бинарный код и где мне его в VB потом хранить ведь в переменные типа iteger и long нечего не поместиться .


    Автор вопроса: Vladimir

    Ответ ожидается по этому адресу

       Как с помощью Microsoft MAPI Controls 6.0 отправить письмо в формате HTML?


    Автор вопроса: Эдуард Маркелов

    Ответ ожидается по этому адресу

       Как получить возможность, переслать тот или иной файл на FTP сервер?




    Ответы:


    Вопрос:

       При открытии почтового клиента хочу чтобы там соядавалось письмо такое:

    Здравствуйте, ...
    Привет вам ия ...

    Собственно вопрос: Что нужно добавить в строку
    mailto:user@server.ru?subject=Hello?body=__вот__сюда
    чтобы соядалось 2 строки в теле письма! СПАСИБО!

    Ответ:

    Автор ответа: P@Ssword

    Пиши:

    mailto:pas_sword@tut.by?subject=Samit,%20hi!&body=Yoy!%20Welcome%20home,%20Samit!%0D%0DBest%20Regards%0DP@Ssword,%20mailto:pas_sword@tut.by

    Проверено на MacroHard Outgluk 2OOO %-)


    Вопрос:

       Как из программы набрать телефонный номер?

    Ответ:

    Автор ответа: Rutshtein Alex

    Используй компоненту Microsoft Comm Control


    Вопрос:

       Как из программы набрать телефонный номер?

    Ответ:

    Автор ответа: Dilon

    Чтобы набрать номер надо сначала шлёпнуть на форму инструмент Microsoft Comm Control, добавить текстовое окно и кнопочку Dial.Код:
    ''''''''''''''''
    Private Sub cmdDial_Click()
         Dim strA As String
         strA = txtNumber.Text
         comOne.CommPort = 1
         comOne.Settings = "9600,N,8,1" 'укажем скорость порта , проверка четности, кол-во битов и контр бит
         comOne.PortOpen = True
         comOne.Output = "ATDT" & strA & vbCr
       End Sub
    Private Sub Form_Unload(Cancel As Integer)
      comOne.PortOpen = False
    End Sub
    ''''''''''''''''


    Вопрос:

       В предыдущем выпуске рассылки (73) обсуждался вопрос о блокировке Ctrl+Alt+Del и о сокрытии проги в списке задач с помощью функций Win32API. По советам авторов ортветов всё отлично работает под Windows98, но к сожалению не под WindowsXP. Как реализовать блокировку Ctrl+Alt+Del или скрыть прогу в списке задач под Windows 2k\XP с помощью функций Win32API?

    Ответ:

    Автор ответа: Dilon

    По-моему, что в XP блокировать комбинацию Ctrl+Alt+Del невозможно


    Вопрос:

       В предыдущем выпуске рассылки (73) обсуждался вопрос о блокировке Ctrl+Alt+Del и о сокрытии проги в списке задач с помощью функций Win32API. По советам авторов ортветов всё отлично работает под Windows98, но к сожалению не под WindowsXP. Как реализовать блокировку Ctrl+Alt+Del или скрыть прогу в списке задач под Windows 2k\XP с помощью функций Win32API?

    Ответ:

    Автор ответа: P@Ssword

    Хотя нет, можно попробовать. Просто берёшь любой постоянный процесс (чтобы всегда был открыт, например explorer.exe), создаёшь в нём поток (thread) и запускаешь в этом потоке свою прогу. Многие ведь не знают, что обычно у эксплорера Х потоков, и не заметят увеличения Х на единицу. К тому же это число постоянно меняется (напр. открытие нового окна - +1поток), так что отследить такую прогу будет очень сложно :)


    Вопрос:

       Как работать с TabStrip?

    Ответ:

    Автор ответа: Dilon

    Мне кажется, что работать с TabStrip очень неудобно(нужно создавать контейнер для элементов управления, потом это всё прописывать в коде). Лучший вариант,на мой взгляд,- использовать SSTab(Microsoft Tabbed Control). Здесь вы просто рисуете элементы управления, не заботясь о всяких там контейнерах.


    Вопрос:

       Можно ли где-то скачать учебник для начинающего програмера. Желательно в формате PDF.

    Ответ:

    Автор ответа: Dilon

    Посмотри здесь http://emanual.ru/


    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел