Все игры
Запись

VBA - Access


Написать комментарий


     24-06-2008 16:09 (ссылка)
Re: VBA - Access
а не проще съимитировать нажатие клавиши Ф5???
Павел Михайлов      24-06-2008 20:22 (ссылка)
Re: VBA - Access
Вот здесь можно посмотреть, 3 варианта на выбор...
     25-06-2008 11:14 (ссылка)
Re: VBA - Access
Во первых UpdateWindow в любом случае не поможет.
Так как UpdateWindow используется только для того чтоб система без очереди послала в оконо WM_PAINT message.
Перед использованием UpdateWindow нужно всегда вызывать InvalidateRect or InvalidateRgn.

Попробуй использовать RedrawWindow.

Если не получится тогда нужно неребрать все чаилд виндовс of DesktopWindow и найти среди них окно класса SysListView32. Затем вызывать RedrawWindow для этого окна.

Потому что вообщем-то Десктоп со всеми его иконками это SysListView32 контрол.

Для помощи можеш использовать spy+ он показывает реяльный хандл того контрола который тебе нужно обновлять.
     25-06-2008 11:32 (ссылка)
Re: VBA - Access
Впрочем RedrawWindow с флагом RDW_ALLCHILDREN должен сработать.
     25-06-2008 13:03 (ссылка)
Re: VBA - Access
Вот так надо:

Public Structure RECT
Public l As Integer
Public t As Integer
Public r As Integer
Public b As Integer
End Structure


Public Enum RDW_
INVALIDATE = &H1
INTERNALPAINT = &H2
[ERASE] = &H4

VALIDATE = &H8
NOINTERNALPAINT = &H10
NOERASE = &H20

NOCHILDREN = &H40
ALLCHILDREN = &H80

UPDATENOW = &H100
ERASENOW = &H200

FRAME = &H400
NOFRAME = &H800
End Enum


Declare Auto Function GetDesktopWindow Lib "User32.dll" () As IntPtr
Declare Auto Function GetWindowRect Lib "User32.dll" (ByVal hwnd As IntPtr, ByRef rc As RECT) As Boolean
Declare Auto Function RedrawWindow Lib "User32.dll" (ByVal hwnd As IntPtr, ByRef rc As RECT, ByVal hrgn As IntPtr, ByVal flags As RDW_) As Boolean


Public Sub RedrawDesktop()
Dim hwnd As IntPtr = GetDesktopWindow()
Dim rc As RECT
GetWindowRect(hwnd, rc)
RedrawWindow(hwnd, rc, IntPtr.Zero, RDW_.INVALIDATE Or RDW_.INTERNALPAINT Or RDW_.ERASE Or RDW_.FRAME Or RDW_.UPDATENOW Or RDW_.ALLCHILDREN)
End Sub

Здесь можеш скачать проект VB.Net там же есть экзешка.
http://aicore.siteburg.com/...
     25-06-2008 13:07 (ссылка)
Re: VBA - Access
Но учти что этот метод обновляет все окна на десктопе, а не только иконки на рабочем столе.
Если же тебе нужно обновлять только иконки на робочем столе, то нужно искать SysListView32 контрол и вызывать RedrawWindow только для этого котрола.
Как я уже писал.
     25-06-2008 13:39 (ссылка)
Re: VBA - Access
А про Ф5 хотел сказать.

Клавиша Ф5 в каждой апликации работает по разному, кроме того эта функция не связана с переокрашивеньем.

В Интернет Эксплорере это означает перезагрезить страницу.
В файловом Эксплорере это означает перезагрузить элементы списка файлов из директории.
На десктопе перезагрузить десктоп иконки.

И конечно же в итоге перерисовать само окно.

Так что это не то что тебе надо, по моему.
     26-06-2008 17:47 (ссылка)
Re: VBA - Access
А у меня всё работает.
Я два метода нашёл.
Вот VB.Net code:

Declare Auto Function FindWindow Lib "User32.dll" (ByVal sClass As String, ByVal sWindow As String) As IntPtr
Declare Auto Function FindWindowEx Lib "User32.dll" (ByVal hwnd As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal sClass As String, ByVal sWindow As String) As IntPtr
Declare Auto Function SendMessage Lib "User32.dll" (ByVal hwnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr

Public Const WM_COMMAND = &H111

Public Sub RefreshDesktop1()
Dim hwnd As IntPtr
hwnd = FindWindow("Progman", "Program Manager")

'41504 Refresh command from F5 to Progman
SendMessage(hwnd, WM_COMMAND, 41504, 0)
End Sub

Public Sub RefreshDesktop2()
Dim hwnd As IntPtr
hwnd = FindWindow("Progman", "Program Manager")
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", "")

'28931 Refresh command from Menu to SHELLDLL_DefView
SendMessage(hwnd, WM_COMMAND, 28931, 0)
End Sub


Скачай со страници моего сайта Desktop Refresher с экзешкой и кодом.
http://aicore.siteburg.com/...
     26-06-2008 22:23 (ссылка)
Re: VBA - Access
Ты меня заитриговал тем что, это невозможно сконвертить на VBA for Access

Вот тебе 3-и метода на VBA:

Private Declare Function FindWindow Lib "User32.dll" Alias "FindWindowA" (ByVal sClass As String, ByVal sWindow As String) As Long
Private Declare Function FindWindowEx Lib "User32.dll" Alias "FindWindowExA" (ByVal hwnd As Long, ByVal hwndChildAfter As Long, ByVal sClass As String, ByVal sWindow As String) As Long
Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function PostMessage Lib "User32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_COMMAND = &H111
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Public Sub RefreshDesktop1()
Dim hwnd As Long
hwnd = FindWindow("Progman", "Program Manager")

'41504 Refresh command from F5 to Progman
SendMessage hwnd, WM_COMMAND, 41504, 0
End Sub

Public Sub RefreshDesktop2()
Dim hwnd As Long
hwnd = FindWindow("Progman", "Program Manager")
hwnd = FindWindowEx(hwnd, 0, "SHELLDLL_DefView", "")

'28931 Refresh command from Menu to SHELLDLL_DefView
SendMessage hwnd, WM_COMMAND, 28931, 0
End Sub

Public Sub RefreshDesktop3()
Dim hwnd As Long
hwnd = FindWindow("Progman", "Program Manager")

'F5 key is 116 Long value
PostMessage hwnd, WM_KEYDOWN, 116, 1
PostMessage hwnd, WM_KEYUP, 116, 1
End Sub

Можеш использовать их с кнопками и без.

Естественно это черновые функции, правельно было бы вписать строки деиствий при ошибках, но это ты уж сам как нибудь.

Скачай с моего сайта Desktop Refresher MDB.
http://aicore.siteburg.com/...
Сергей Щербатюк      01-07-2008 11:49 (ссылка)
Re: VBA - Access
Наконец все заработало ) Спасибо всем большое.

Написать комментарий