VBでグローバルフックを使って、
アクティブウィンドウが変わったタイミングで、
アクティブになったウィンドウのハンドルを知りたいと思います。
DLLを使わないといけないようなので、VCを使ってDLLを作ってみました。
実行すると、ウィンドウの切り替わり時にフリーズし、
アクティブにしたウィンドウが閉じられてしまいます。
原因が分からなくて困っています。お願いします。
環境は、VB6とVC++6の組み合わせです。
#include <windows.h>
#define DllExport __declspec( dllexport )
DllExport int CALLBACK SetHook(HWND MyWnd);
DllExport void CALLBACK FreeHook(void);
DllExport HWND GetActivateWindow(void);
DllExport void WINAPI SetCallBackProc(void (CALLBACK *CallBackWindow)(HWND));
#pragma data_seg(".sharedata")
HHOOK hHookWnd = NULL;
HWND WndHandle = NULL;
HWND MyWndHandle = NULL;
#pragma data_seg()
HINSTANCE hdll;
void (CALLBACK *ProcActiveWindow)(HWND);
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwCallPurpose, LPVOID lpReserved){
switch(dwCallPurpose){
case DLL_PROCESS_ATTACH :
hdll = hInst;
break;
case DLL_THREAD_ATTACH :
case DLL_PROCESS_DETACH :
case DLL_THREAD_DETACH :
break;
}
return TRUE;
}
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){
if( nCode == HCBT_ACTIVATE ){
WndHandle = (HWND)wParam;
(*ProcActiveWindow)(WndHandle);
}
return CallNextHookEx(hHookWnd, nCode, wParam, lParam);
}
int CALLBACK SetHook(HWND MyWnd){
MyWndHandle = MyWnd;
if (!hHookWnd){
hHookWnd = SetWindowsHookEx(WH_CBT, CBTProc, hdll, 0);
if (hHookWnd == NULL){
return 0;
}
}
return -1;
}
void CALLBACK FreeHook(void){
UnhookWindowsHookEx(hHookWnd);
}
HWND GetActivateWindow(void){
return WndHandle;
}
void WINAPI SetCallBackProc(void (CALLBACK *CallBackWindow)(HWND))
{
ProcActiveWindow = CallBackWindow;
}
因みに、DLLを読み込んでいるのはVB6プログラム?
そして、SetCallBackProcに渡している関数は、VB6側
の関数?
もしそうなら、無理です。
DLLをロードさせるのは、VC等で作ったEXEにして
そのEXEをVB6から起動する時に、VB6が知ること
ができる『何か』にDLL側からその『何か』を使って知
らせると言う方法でないと・・・
VB6でも最低限、サブクラス化してフォームに飛び込んで
くるメッセージを拾えるようにしておかないと・・・
因みに、私は、PostMessageでVB6側が知るように作った
ことがあります。
ご参考までに・・・
以上。
オショウ様、ご返答有難うございます。
SendMessageを使ってVBへメッセージを送る事で、無事解決しました。
度々で申し訳ないのですが、
ウィンドウが切り替わった時に、
アクティブウィンドウの画面キャップチャをとりたいと考えてます。
キャプチャの実装も出来ているのですが、
タイミングが、ウィンドウが表示される前になっていて、
切り替わるウィンドウがキャプチャされません。
何か、ご存じないでしょうか?
キャプチャ前にDoEventsを入れてもだめですか?
Luna様、ご回答有難うございます。
DoEventsを入れてみたのですが、
まだうまく機能しません。
ウェイトかけるというのも、問題ですし…。
ツイート | ![]() |