powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CreateThread for 64 - bit (AddressOf)
20 сообщений из 20, страница 1 из 1
CreateThread for 64 - bit (AddressOf)
    #40024066
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Необходимо из под 64-bit Excel запустить поток
Использую стандартный прием с CreateThread
Вопрос как передать адрес пользов. функции AddressOf не работает

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare PtrSafe Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Sub AA()
  Dim hThread As PtrLong, iThread As Long
  hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf PressKey, ByVal 0&, ByVal 0&, iThread)
  .............................................
  Call TerminateThread(hThread, ByVal 0&)
  Call CloseHandle(hThread)
End Sub

Public Sub PressKey()
  Dim iSec As Long, hwnd As Long, hBut As Long, bKey As Boolean, iThread As Long, iDialog As Long
  Dim I As Integer, SetInput(0 To 1) As KINDINPUT, KeyInput As KEYBDINPUT, F As Long
  MsgBox 'Button Click'
End Sub



Спасибо
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40024406
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

В таком виде работает, точнее пытается работать, но может упасть легко. Вообще выводить MsgBox нельзя (это не UI поток) и использовать вообще VBA функции из другого потока не желательно (вероятность что упадёт высока). Возможно это связано с особенностью рантайма. Лучше вместо запуска потока запускать другой процесс в котором выполнять логику и написать велосипед для синхронизации данных между процессами, если уж так хочется. Пока отлаживал код, раз 15 падал Excel и то, скорее всего где-то с типами косяки ещё есть

Код: vbnet
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.
Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr
Private Declare PtrSafe Function TerminateThread Lib "kernel32" (ByVal hThread As LongPtr, ByVal dwExitCode As Long) As Long
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long

Sub AA()
    Dim hThread As LongPtr, iThread As Long
    Dim FuncAddr As LongPtr
    
    hThread = CreateThread(ByVal 0&, ByVal 0&, Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread)
    
    Call Wait(5) ' Ждём 5 секунд, перед закрытием потока
    
    Call TerminateThread(hThread, ByVal 0&)
    Call CloseHandle(hThread)
    
    MsgBox "Всё хорошо..."
End Sub

Public Sub PressKey()
    Dim I As Integer
    
    For I = 1 To 10
        Open "D:\File.txt" For Append As #1
        Print #1, "Data"
        Close #1
        
        Call Wait(1)
    Next
End Sub

Public Sub Wait(Seconds As Integer)
    Dim waiter As Single
    
    waiter = Timer + Seconds
    Do While waiter > Timer
    Loop
End Sub
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40024428
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VBA не поддерживает многопоточность
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40024957
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD

Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread)


Ваш прием понятен - спасибо !
Насчет Wait - здесь надуюсь будет все в норме

Это "таблетка" для автозапуска диал. окна Outlook
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40024993
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
VBA не поддерживает многопоточность

Почему?
А как же DoEvents?
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025003
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha
Eolt
VBA не поддерживает многопоточность

Почему?


Разработчики VBA посчитали что нативная поддержка многопоточности в языке не нужна и только запутает пользователей.

авторDoEvents

К многопоточности это не имеет отношения.
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025044
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

Доброго дня господа !

НЕ !! все получилось .... борюсь еще

спасибо за подсказки
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025045
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А что в WIN10x64 нет аналогичных функций
Имею в виду

Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr


Private Declare PtrSafe Function CreateThread Lib "kernel 64 " (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr

Зачем использовать 32-bit библиотеки ?
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025062
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Спасибо Вам за помощь !

Но не могли бы подправить (ИЛИ ПОДСКАЗАТЬ как отладить в потоке код)
Для отладки располагаю только (!!!!!!) оболочкой EXCEL.

Суть кода - запуск сообщений по Outlook
В процессе оправки (Outlook.Send)
Проявляется окно диалога с вопросом "Прога хочет отправить сообщение"
Три кнопки "Разрешить" "Запретить" "Справка"

Как отключить такой диалог знаю, но не имею орг. возможностей
В 32-bit версии просто ДОЖИМАЛ кнопку "Разрешить" из предварительно запущенного потока
hThread = CreateThread(ByVal 0&, ByVal 0&, Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread)

Сейчас 64-bit - не совсем понимаю что и как привести к такому типу данных LongPtr

Код абсолютно рабочий
- запуск c 1-го экземпляра Excel = SendFileOutlook (с блокировкой 'hThread = CreateThread.............)
- запуск с 2-го зкземпляра Excel = PressKey
- активизация окна диалога = Microsoft Outlook
- активизация кнопки = Разрешить
Такой дожим кнопки происходит корректно, но запуск с одного экземпляра приводит к ошибке
Как отследить ошибку не совсем понимаю....

Подскажите(подправьте) пожалуйста
Код: vbnet
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
Private Const olMailItem = 0
Private Const BM_GETSTATE = &HF2
Private Const BM_SETSTATE = &HF3
Private Const VK_RETURN = &HD
Private Const INPUT_KEYBOARD = 1
Private Const KEYEVENTF_KEYUP = &H2

Public Type KINDINPUT
  dwType As Long
  xi(0 To 23) As Byte
End Type

Public Type KEYBDINPUT
  wVk As Integer
  wScan As Integer
  dwFlags As Long
  Time As Long
  dwExtraInfo As Long
End Type

Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr
Private Declare PtrSafe Function TerminateThread Lib "kernel32" (ByVal hThread As LongPtr, ByVal dwExitCode As Long) As Long
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long


Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare PtrSafe Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare PtrSafe Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare PtrSafe Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As KINDINPUT, ByVal cbSize As Long) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Sub PressKey()
  Dim iSec As Long, hwnd As Long, hBut As Long, bKey As Boolean, iThread As Long, iDialog As Long
  Dim I As Integer, SetInput(0 To 1) As KINDINPUT, KeyInput As KEYBDINPUT, F As Long
  For I = 0 To 1
    KeyInput.wVk = VK_RETURN
    KeyInput.wScan = 0
    KeyInput.dwFlags = IIf(I = 0, 0, KEYEVENTF_KEYUP)
    KeyInput.Time = 0
    KeyInput.dwExtraInfo = 0
    SetInput(I).dwType = INPUT_KEYBOARD
    Call CopyMemory(SetInput(I).xi(0), KeyInput, Len(KeyInput))
  Next I
  iSec = Timer
  Do
    DoEvents
  Loop Until Timer > iSec + 6
  Do
    hwnd = FindWindow("#32770", "Microsoft Outlook")
    DoEvents
  Loop Until hwnd > 0
  Do
    hBut = FindWindowEx(hwnd, ByVal 0&, "Button", "Разрешить")
    DoEvents
  Loop Until hBut > 0
  Do
    bKey = IsWindowEnabled(hBut)
    DoEvents
  Loop Until bKey
  iThread = GetCurrentThreadId()
  iDialog = GetWindowThreadProcessId(hwnd, 0&)
  Call AttachThreadInput(iThread, iDialog, True)
  Call SetActiveWindow(hwnd)
  Call SetFocusAPI(hBut)
  Call SendMessage(hBut, BM_SETSTATE, True, ByVal 0&)
  Call SendInput(2, SetInput(0), Len(SetInput(0)))
  Call AttachThreadInput(iThread, iDialog, False)
End Sub

Sub SendFileOutlook(Optional Whom As String = "NULL", Optional Path As String = "NULL", Optional Tema As String = "NULL", Optional Note As String = "NULL")
  Dim Outlook As Object, RunLook As Boolean, hThread As LongPtr, iThread As Long, One As Variant
  If Tema <> "" Then
    If Not IsNull(Whom) Then
      On Error Resume Next
      Set Outlook = GetObject(, "Outlook.Application")
      If Err.Number <> 0 Then
        Set Outlook = CreateObject("Outlook.Application")
        RunLook = True
        Err.Clear
      End If
      With Outlook.CreateItem(olMailItem)
        .To = Whom
        .Subject = Tema
        .Body = Note
        For Each One In Split(Path, ";")
          .Attachments.Add CStr(One), , 1, " "
        Next
   
        hThread = CreateThread(ByVal 0&, ByVal 0&, Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread)
        .Send
        
        Call TerminateThread(hThread, ByVal 0&)
        Call CloseHandle(hThread)
      
      End With
      If RunLook Then
        Outlook.Quit
        Set Outlook = Nothing
      End If
    End If
  End If
End Sub



Заранее благодарен !
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025141
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСейчас 64-bit - не совсем понимаю что и как привести к такому типу данных LongPtr

Если эксель 32-битный, то никак. Если 64-битный, то в нем появился тип LongLong
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025395
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt

авторDoEvents

К многопоточности это не имеет отношения.


Именно на этой команде и идет слет потока

Не могли бы подсказать как ее изобразить 64 - bit версии VBA
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025398
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Excel 64 Bit
На тип LongPtr перевел все функции которые имеют отношение к объектам (указатели окон диалогов)

Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As LongPtr , lpdwProcessId As Long) As LongPtr

Но запустить в одном экземпляре - ни как не получаеться
В двух (Press - один Excel) (Outlook - другой Excel) - все работает предсказуемо

Заранее благодарен !
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025432
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Eolt

пропущено...

К многопоточности это не имеет отношения.


Именно на этой команде и идет слет потока

Не могли бы подсказать как ее изобразить 64 - bit версии VBA


Падает потому что команда часть рантайма VBA, а он не поддерживает многопоточность.

Есть вариант Doevents на Api, если нужно могу через пару дней скинуть.
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40025538
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Может проще под конкретную задачу, сделаете на VB6 отдельный Exe, который будет жать кнопку. А из под OutLook уже управлять им (запуск/остановку приложения).
Либо можно отдельный файлик Excel иметь с логикой нажатия. И уже запускать отдельный экземпляр Excel с
запуском макроса.
Либо конкретно под вашу задачу, можно даже не создавать отдельный поток, а создать функцию-таймера и там уже выполнять логику. Вариантов реализаций несколько есть
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40026151
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt

Падает потому что команда часть рантайма VBA, а он не поддерживает многопоточность.

Есть вариант Doevents на Api, если нужно могу через пару дней скинуть.


Т.е. ИМЕННО Excel 2016 64-bit не поддерживает многопоточность ?
C какой именно точки отсчета (версии, разрядности.....)

P.S. старая работающая версия была реализована в Excel 2010 32-bit


вариант Doevents на Api - если Вас не затруднит ... будет очень полезно
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40026154
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD
HOME_X,

Может проще под конкретную задачу, сделаете на VB6 отдельный Exe, который будет жать кнопку. А из под OutLook уже управлять им (запуск/остановку приложения).
Либо можно отдельный файлик Excel иметь с логикой нажатия. И уже запускать отдельный экземпляр Excel с
запуском макроса.
Либо конкретно под вашу задачу, можно даже не создавать отдельный поток, а создать функцию-таймера и там уже выполнять логику. Вариантов реализаций несколько есть


" отдельный экземпляр Excel " - реализовано - без особого восторга

отписать 32-bit класс(приложение) в ДОНАЖАТЬ кнопку - есть такое соображение

" создать функцию-таймера" - если не сложно уточните пожалуйста КОДОМ ...

Спасибо
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40026179
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

Т.е. ИМЕННО Excel 2016 64-bit не поддерживает многопоточность ?
C какой именно точки отсчета (версии, разрядности.....)


Никакая версия VBA не поддерживает многопоточность.

авторвариант Doevents на Api - если Вас не затруднит ... будет очень полезно

Вот тут есть примеры реализации. https://www.vbforums.com/showthread.php?315416
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40026348
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
" создать функцию-таймера" - если не сложно уточните пожалуйста КОДОМ ...


Когда отобразится окно для подтверждения отправки письма, код VBA в процессе может быть приостановлен. Остановка будет, скорее всего, не через метод аналогичный API Sleep, иначе весь интерфейс (у меня Excel) также засыпает. В примере ниже не сможет код отработать, т.к. Sleep тормозит всё. Для вашей ситуации надо простестировать, может и сможет быть вызвана функция, когда будет открыто диалоговое окно

Module
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Option Explicit

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub Test()
    StartTimer Me, "RunInTimer"
    Sleep 10000 ' Поток засыпает, но и всё приложение в том числе, таймер не сможет быть обработан
End Sub


Public Sub RunInTimer()
    Dim I As Long
    
    For I = 1 To 10
        Open "D:\1.txt" For Append As #1
        Print #1, Now
        Close #1
        
        Wait 1
    Next
End Sub

Module
Код: vbnet
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.
Option Explicit

Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongLong, ByVal lpTimerFunc As LongPtr) As LongLong
Public Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongLong

Private TimerID As LongPtr
Private ProcName As String
Private ProcContext As Object

Public Sub TimerProc(ByVal hwnd As LongPtr, ByVal wMsg As LongLong, ByVal idEvent As LongPtr, ByVal dwTime As LongLong)
    On Error Resume Next
    KillTimer hwnd, TimerID
    
    Open "D:\Log.txt" For Append As #2
    Print #2, Now
    Close #2
        
    CallByName ProcContext, ProcName, VbMethod, Nothing
End Sub

Public Sub StartTimer(Context As Object, FunctionName As String)
    Set ProcContext = Context
    ProcName = FunctionName
    TimerID = SetTimer(0&, 0&, 1000, AddressOf TimerProc)
End Sub

Public Sub Wait(Seconds As Integer)
    Dim waiter As Single
    
    waiter = Timer + Seconds
    Do While waiter > Timer
    Loop
End Sub

...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40029914
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Дал начальную большую задержку ДO момента активации окна OutLook
DoEvents отключил совсем
Hande окон и кнопок получаю <>0

Код: vbnet
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.
Public Sub PressKey()
  Dim iSec As Long, hwnd As Long, hBut As Long, bKey As Boolean, iThread As Long, iDialog As Long
  Dim I As Integer, SetInput(0 To 1) As KINDINPUT, KeyInput As KEYBDINPUT, F As Long
  For I = 0 To 1
    KeyInput.wVk = VK_RETURN
    KeyInput.wScan = 0
    KeyInput.dwFlags = IIf(I = 0, 0, KEYEVENTF_KEYUP)
    KeyInput.Time = 0
    KeyInput.dwExtraInfo = 0
    SetInput(I).dwType = INPUT_KEYBOARD
    Call CopyMemory(SetInput(I).xi(0), KeyInput, Len(KeyInput))
  Next I
  iSec = Timer
  Do
    'DoEvents
  Loop Until Timer > iSec + 6
  Do
    hwnd = FindWindow("#32770", "Microsoft Outlook")
    'DoEvents
  Loop Until hwnd > 0
  Do
    hBut = FindWindowEx(hwnd, ByVal 0&, "Button", "Разрешить")
    'DoEvents
  Loop Until hBut > 0
  Do
    bKey = IsWindowEnabled(hBut)
    'DoEvents
  Loop Until bKey
  iThread = GetCurrentThreadId()
  iDialog = GetWindowThreadProcessId(hwnd, 0&)
  Call AttachThreadInput(iThread, iDialog, True)
  Call SetActiveWindow(hwnd)
  Call SetFocusAPI(hBut)
  Call SendMessage(hBut, BM_SETSTATE, True, ByVal 0&)
  Call SendInput(2, SetInput(0), Len(SetInput(0)))
  Call AttachThreadInput(iThread, iDialog, False)
End Sub



Получаю такой эффект
- как бы нажалась кнопка = SendMessage(hBut, BM_SETSTATE..............)
- но окно "ТРЕХ КНОПОК" по прежнему наблюдаю на экране
если выйти из фокуса этого окна - перейти в окно FAR или активного Excel или любое другое
Система отрабатывает предсказуемо

Повторно под 32 все работало в 64 bit вот такая чепуха.

Может что-то не так в этом блоке
iThread = GetCurrentThreadId()
iDialog = GetWindowThreadProcessId(hwnd, 0&)
Call AttachThreadInput(iThread, iDialog, True)
Call SetActiveWindow(hwnd)
Call SetFocusAPI(hBut)
Call SendMessage(hBut, BM_SETSTATE, True, ByVal 0&)
Call SendInput(2, SetInput(0), Len(SetInput(0)))
Call AttachThreadInput(iThread, iDialog, False)

--------------------------------------------
Вот этого я совсем не понимаю
For I = 0 To 1
KeyInput.wVk = VK_RETURN
KeyInput.wScan = 0
KeyInput.dwFlags = IIf(I = 0, 0, KEYEVENTF_KEYUP)
KeyInput.Time = 0
KeyInput.dwExtraInfo = 0
SetInput(I).dwType = INPUT_KEYBOARD
Call CopyMemory(SetInput(I).xi(0), KeyInput, Len(KeyInput))
Next I
---------------------------------
Спасибо
...
Рейтинг: 0 / 0
CreateThread for 64 - bit (AddressOf)
    #40029979
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

SendInput = насколько понимаю это имитация нажатия
Но разрядность другая - следовательно типы описанные ранее не соответствуют
Что-то аналогичное есть https://progi.pro/sendinput-i-64-bit-4374889

Кто хорошо разбирается в API подскажите как правильно привести 32 bit к 64 bit
структуре

Спасибо
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CreateThread for 64 - bit (AddressOf)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]