在一个程序中,需要打开Excel。但是,希望在关闭Excel的时候首先通知启动程序,该如何解决?我以前一直用BCB的,这次用VB.NET,主要代码如下,可就是不能响应.谁知道Spy++和MySpy是怎么做的吗?
m_comExcelApp.Visible = True
strCaption = m_comExcelApp.Caption.Trim
lMainWnd = FindWindow("XLMAIN", strCaption) 找到启动的Excel
Debug.WriteLine("Excel Handle:" + CStr(lMainWnd.ToInt32))
Dim pid As IntPtr
Dim err As IntPtr
If lMainWnd.ToInt32 <> 0 Then
err = GetWindowThreadProcessId(lMainWnd, pid) 获得Thread ID
End If
Debug.WriteLine("Excel Thread ID:" + CStr(err.ToInt32))
Debug.WriteLine("Excel Process ID:" + CStr(pid.ToInt32))
设置钩子
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf CBTProc, pid.ToInt32, err.ToInt32)
-------------------
In Module
-------------------
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As HookFuncType, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Delegate Function HookFuncType(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Const WH_KEYBOARD As Short = 2
Public Const KBH_MASK As Integer = &H20000000
Public Const WM_LBUTTONDOWN As Short = &H201s
Public Const WM_LBUTTONUP As Short = &H202s
Public Const WM_CLOSE = &H10
Public Const WH_CALLWNDPROC = 4
Public hHook As Integer
钩子进入点
Public Function CBTProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
MsgBox(".........Capture ExcelEvent")
If nCode >= 0 Then
Process keys you want to filter
End If
CBTProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
to cwsheng 下面是myspy的hook代码:
LRESULT CALLBACK MsgHookProc1(int nCode, WPARAM wParam,LPARAM lParam)
{
if (nCode>=0)
{
CWPSTRUCT* mm=(CWPSTRUCT*)lParam;
MsgData data;
data.msg=mm->message;
data.wparam=(int)mm->wParam;
data.lparam=(int)mm->lParam;
data.type=1;
data.result=0;
COPYDATASTRUCT copydata;
copydata.dwData=0;
copydata.cbData=sizeof(MsgData);
copydata.lpData=&data;
if(mm->hwnd==HookStruct->HookedWnd)
{
SendMessage(HookStruct->ParentWnd,WM_COPYDATA,0,(LPARAM)©data);
}
}
return(CallNextHookEx(HookStruct->MsgHook1,nCode,wParam,lParam));
}
extern "C" __declspec(dllexport)
void DisableMsgHook()
{
if (HookStruct->MsgHook1!=NULL)
{
UnhookWindowsHookEx(HookStruct->MsgHook1);
UnhookWindowsHookEx(HookStruct->MsgHook2);
UnhookWindowsHookEx(HookStruct->MsgHook3);
HookStruct->MsgHook1=NULL; // жµôй³×Ó
HookStruct->MsgHook2=NULL; // жµôй³×Ó
HookStruct->MsgHook3=NULL; // жµôй³×Ó
HookStruct->HookedWnd=NULL;
HookStruct->ParentWnd=NULL;
}
}
extern "C" __declspec(dllexport)
void EnableMsgHook(HWND hwnd,HWND parent)
{
if (HookStruct->MsgHook1==NULL)
{
HookStruct->HookedWnd=hwnd;
HookStruct->ParentWnd=parent;
HookStruct->MsgHook1=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MsgHookProc1,DllHinst,0);
HookStruct->MsgHook2=SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)MsgHookProc2,DllHinst,0);
HookStruct->MsgHook3=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MsgHookProc3,DllHinst,0);
}
}