rank1
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Хочу поделиться со всеми VBшниками способом выдирания деклараций для api файлов. 1. Запускаем Excel 2. Добавляем 2 модуля Модуль1 Код: Option Explicit Declare Function SendMessage Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ wParam As Any, _ lParam As Any) _ As Long Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) _ As Long Declare Function FindWindowEx Lib "user32.dll" _ Alias "FindWindowExA" _ (ByVal hParent As Long, _ ByVal hChild As Long, _ ByVal lpszClassname As String, _ ByVal lpszWindow As String) _ As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long) Public Const WM_SETTEXT = &HC Private Const WM_GETTEXT = &HD Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Const VK_CONTROL As Integer = &H11 Sub reader() Dim hw hw = InputBox("GetHwnd", "Type captured hwnd of F2 window", Empty) If Trim(hw) = "" Then Exit Sub Dim hwnd As Long: hwnd = CLng("&H" & hw) Dim pwd1 As String * 1024 Dim pwd2 As String * 1024 Dim s1, s2 Dim h As Scripting.Dictionary Set h = New Scripting.Dictionary While Not GetKeyState(VK_CONTROL) < 0 DoEvents Call SendMessage(hwnd, WM_GETTEXT, 1024, ByVal pwd1) s1 = TrimNull(pwd1) Sleep 20 '50 Call SendMessage(hwnd, WM_GETTEXT, 1024, ByVal pwd2) s2 = TrimNull(pwd2) If s1 = s2 Then h(Replace(Replace(s1, Chr(10), ""), Chr(13), "<13_10>")) = 1 End If Application.Caption = Replace(Replace(s1, Chr(10), ""), Chr(13), "<13_10>") Wend Dim t As String, k For Each k In h.Keys t = t & k & Chr(13) Next k data2Notepad CStr(t) End Sub Public Function TrimNull(startstr As String) As String Dim pos As Integer pos = InStr(startstr, Chr$(0)) If pos Then TrimNull = Left$(startstr, pos - 1) Exit Function End If TrimNull = startstr End Function | Данный код внедрен в форум с помощью скрипта vladvro Модуль2: Код: Option Explicit Public Const GW_HWNDNEXT = 2 Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _ ByVal wCmd As Long) As Long 'Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ ' (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hwnd As Long, lpdwprocessid As Long) As Long Function ProcIDFromWnd(ByVal hwnd As Long) As Long Dim idProc As Long GetWindowThreadProcessId hwnd, idProc ProcIDFromWnd = idProc End Function Function GetWinHandle(hInstance As Long) As Long Dim tempHwnd As Long ' Grab the first window handle that Windows finds: tempHwnd = FindWindow(vbNullString, vbNullString) ' Loop until you find a match or there are no more window handles: Do Until tempHwnd = 0 ' Check if no parent for this window If GetParent(tempHwnd) = 0 Then ' Check for PID match If hInstance = ProcIDFromWnd(tempHwnd) Then ' Return found handle GetWinHandle = tempHwnd ' Exit search loop Exit Do End If End If ' Get the next window handle tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT) Loop End Function Sub data2Notepad(TextToSend As String) Dim hInst As Long ' Instance handle from Shell function. Dim hWndApp As Long ' Window handle from GetWinHandle. Dim hwnd As Long hInst = Shell("notepad.exe", vbNormalFocus) hWndApp = GetWinHandle(hInst) If hWndApp <> 0 Then hwnd = FindWindowEx(hWndApp, 0, "Edit", vbNullString) If hwnd <> 0 Then Call SendMessage(hwnd, WM_SETTEXT, ByVal 0&, ByVal TextToSend) Else Err.Raise vbObjectError + 1, , "Can't find notepad Edit control" End If Else Err.Raise vbObjectError + 1, , "Can't find notepad" End If End Sub | Данный код внедрен в форум с помощью скрипта vladvro 3 Загружаем бесплатный inqsoft window scanner http://kickme.to/inqsoft 4 В VBA среде подключаем нужные библиотеки типов в меню References (описания объектов этих библиотек будем грабить) 5 Нажимаем F2 и сканером берем хендл самого нижнего подокошка бравзера объектов. 6 Запускаем макрос reader 7 Вводим в инпутбокс хендл нижнего подокошка выдранный inq scanner'ом 8 Ставим курсор на первый выдираемый класс в Classes, и держа стрелку вниз бежим по всем его членам. Так делаем для всех интересующих нас класов. 9 Нажимаем Ctrl+q - и в нотпаде открываются выграбленные описания. 10 Копируем их в Ворд, через Replace и редактирование убираем все что нам не нужно - <13_10> заменяем на ^13, убираем ненужные описания, и получившиеся декларации засовываем в VB.api Добавлено: Еще есть идейка написать скрипт для скайта, который abbrev файл преобразовывает в файл replace.dat для PuntoSwitcher. Скрипт конвертирует скайтовские аббревы в пунтосвитчеровские, которые становятся доступными для использования в любом Windows приложении - в любом редакторе и в любой среде разработки либо по клавиатуре либо через список быстрой вставки. Такой скрипт есть у меня для Экселя, - он позволяет любую область листа скинуть в PuntoSwitcher и производить автоввод значений в любом приложении. По этому же принципу можно написать конвертер аббревов и скрипт скидывающий все строки текущего файла в replace.dat. Формат replace.dat текстовый и очень простой. |