的FindWindow不会在64位VBA7工作 [英] Findwindow does not work in 64bit VBA7

查看:1759
本文介绍了的FindWindow不会在64位VBA7工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在$ C psented在<一$ C $ P $ href="http://stackoverflow.com/questions/30508341/unlocking-password-protected-vba-project/30604345#30604345">Unlocking密码保护的VBA项目在32而不是64位工作。 具体而言,

The code presented at Unlocking Password Protected VBA project works under 32 but not 64bit. Specifically,

Ret = FindWindow(vbNullString, "VBAProject Password")

总是返回0。我已经试过

always return 0. I have tried

Ret = FindWindow("#32770", "VBAProject Password")

Ret = FindWindow("XLMAIN", "VBAProject Password")

无工作。我也曾尝试以下API:setforegroundwindow,bringwindowtotop,SETFOCUS,getactivewindow,getwindowthreadprocessid。还是失败了,所以我不认为这是一个焦点问题。或许它选择的时机?我试图用

None works. I have also tried the following APIs: setforegroundwindow, bringwindowtotop, setfocus, getactivewindow, getwindowthreadprocessid. Still failed so I don't think it's a focus issue. Perhaps it's timing? I tried using

SetTimer

但我是新来的API所以不知道如何实现。

but I am new to APIs so not sure how to implement that.

我通过我的personal.xlsb内workbookopen应用程序事件我想在打开任何工作簿填写密码,调用此。

I am calling this via the workbookopen app event inside my personal.xlsb I am trying to fill in password upon opening any workbook.

Private Sub AppEvent_WorkbookOpen(ByVal wb As Excel.Workbook)

If wb.VBProject.Protection <> 1 Then
Exit Sub
End If

Call unlockvba(wb)

End Sub

编辑:我已经把我的声明PTRSAFE和LongPtr适用

I have set my declarations to PtrSafe and LongPtr where applicable.

推荐答案

想通了。这个问题是不是64位,这是一个定时/焦点问题。

Figured it out. The issue wasn't 64bit, it was a timing/focus issue.

Sub unlockVBA(wb)

If wb.name = "PERSONAL.XLSB" Then Exit Sub

Application.VBE.MainWindow.Visible = True

TimerID = SetTimer(0&, 0&, 500&, AddressOf TimerProc)

Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute

End Sub

Public Sub TimerProc(ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr)

On Error Resume Next
KillTimer hwnd, TimerID

MyPassword = "password"

Ret = FindWindow(vbNullString, "VBAProject Password")
ChildRet = FindWindowEx(Ret, ByVal 0&, "Edit", vbNullString)
If ChildRet <> 0 Then
Call SendMessage(ChildRet, WM_SETTEXT, False, ByVal MyPassword)
DoEvents
End If

ChildRet = FindWindowEx(Ret, ByVal 0&, "Button", vbNullString)

If ChildRet <> 0 Then
'MsgBox "Button's Window Found"

'~~> Get the caption of the child window
strBuff = String(GetWindowTextLength(ChildRet) + 1, Chr(0))
GetWindowText ChildRet, strBuff, Len(strBuff)
ButCap = strBuff

'~~> Loop through all child windows
Do While ChildRet <> 0
    '~~> Check if the caption has the word "OK"
    If InStr(1, ButCap, "OK") Then
    '~~> If this is the button we are looking for then exit
    OpenRet = ChildRet
    Exit Do
    End If

    '~~> Get the handle of the next child window
    ChildRet = FindWindowEx(Ret, ChildRet, "Button", vbNullString)
    '~~> Get the caption of the child window
    strBuff = String(GetWindowTextLength(ChildRet) + 1, Chr(0))
    GetWindowText ChildRet, strBuff, Len(strBuff)
    ButCap = strBuff
Loop

If OpenRet <> 0 Then
'~~> Click the OK Button
SendMessage ChildRet, BM_CLICK, 0, vbNullString
Else
MsgBox "The Handle of OK Button was not found"
End If
Else
MsgBox "Button's Window Not Found"
End If

这篇关于的FindWindow不会在64位VBA7工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆