Option Compare Database Option Explicit Private Const GW_HWNDNEXT = &H2 Private Const WM_SETTEXT = &HC Private Const BM_CLICK = &HF5 Private Const IDOK = &H1 Private Const IDCANCEL = &H2 Private Const IDHELP = &H9 Private Const IDC_EDIT = &H8A5 '決め打ち 'http://msdn.microsoft.com/ja-jp/library/cc364779.aspx Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hwnd As LongPtr, _ lpdwProcessId As Long _ ) As Long 'http://msdn.microsoft.com/ja-jp/library/cc364757.aspx Private Declare PtrSafe Function GetWindow Lib "user32" ( _ ByVal hwnd As LongPtr, _ ByVal wCmd As Long _ ) As LongPtr 'http://msdn.microsoft.com/ja-jp/library/cc364718.aspx Private Declare PtrSafe Function GetParent Lib "user32" ( _ ByVal hwnd As LongPtr _ ) As LongPtr Private Declare PtrSafe Function FindWindow Lib "user32" _ Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As LongPtr 'http://msdn.microsoft.com/ja-jp/library/cc364701.aspx Private Declare PtrSafe Function GetLastActivePopup Lib "user32" ( _ ByVal hwndOwnder As LongPtr _ ) As LongPtr 'http://msdn.microsoft.com/ja-jp/library/cc364621.aspx Private Declare PtrSafe Function GetDlgItem Lib "user32" ( _ ByVal hDlg As LongPtr, _ ByVal nIDDlgItem As Long _ ) As LongPtr Private Declare PtrSafe Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hwnd As LongPtr, _ ByVal wMsg As Long, _ ByVal wParam As LongPtr, _ lParam As Any _ ) As LongPtr 'http://support.microsoft.com/kb/242308/ja 'EnumWindows Private Function ProcIDFromWnd(ByVal hwnd As LongPtr) As Long Dim idProc As Long ' Get PID for this HWnd GetWindowThreadProcessId hwnd, idProc ' Return PID ProcIDFromWnd = idProc End Function Private Function GetWinHandle(hInstance As Long) As LongPtr Dim tempHwnd As LongPtr ' 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 OpenAccdrWithPassword( _ targetDBFullPath As String, _ pswd As String, _ Optional WindowStyle As VbAppWinStyle = vbNormalFocus) Dim taskID As Long Dim targetDBHwnd As LongPtr Dim pswdDlgHwnd As LongPtr Dim dlgEditHwnd As LongPtr, dlgButtonOKHwnd As LongPtr If Dir(targetDBFullPath) = "" Then Exit Sub taskID = Shell("msaccess.exe /runtime " & _ targetDBFullPath, _ WindowStyle) 'hInstanceなのか? targetDBHwnd = GetWinHandle(taskID) Do pswdDlgHwnd = GetLastActivePopup(targetDBHwnd) Loop While targetDBHwnd = pswdDlgHwnd dlgEditHwnd = GetDlgItem(pswdDlgHwnd, IDC_EDIT) dlgButtonOKHwnd = GetDlgItem(pswdDlgHwnd, IDOK) SendMessage dlgEditHwnd, WM_SETTEXT, 0, ByVal pswd SendMessage dlgButtonOKHwnd, BM_CLICK, 0, 0 End Sub
2011/01/03
office2010 Win32API GetDlgItem/GetLastActivePopup
ラベル:
access 2010,
API,
Office 2010,
VBA
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿