ウィンドウの切り替わりを取得するには


TANA  2007-03-22 05:42:09  No: 98331

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;
}


オショウ  2007-03-22 07:25:25  No: 98332

因みに、DLLを読み込んでいるのはVB6プログラム?
そして、SetCallBackProcに渡している関数は、VB6側
の関数?

もしそうなら、無理です。

DLLをロードさせるのは、VC等で作ったEXEにして
そのEXEをVB6から起動する時に、VB6が知ること
ができる『何か』にDLL側からその『何か』を使って知
らせると言う方法でないと・・・

VB6でも最低限、サブクラス化してフォームに飛び込んで
くるメッセージを拾えるようにしておかないと・・・

因みに、私は、PostMessageでVB6側が知るように作った
ことがあります。

ご参考までに・・・

以上。


TANA  2007-03-25 00:16:56  No: 98333

オショウ様、ご返答有難うございます。

SendMessageを使ってVBへメッセージを送る事で、無事解決しました。

度々で申し訳ないのですが、
ウィンドウが切り替わった時に、
アクティブウィンドウの画面キャップチャをとりたいと考えてます。
キャプチャの実装も出来ているのですが、
タイミングが、ウィンドウが表示される前になっていて、
切り替わるウィンドウがキャプチャされません。

何か、ご存じないでしょうか?


Luna  2007-03-25 08:20:11  No: 98334

キャプチャ前にDoEventsを入れてもだめですか?


TANA  2007-03-26 07:07:49  No: 98335

Luna様、ご回答有難うございます。

DoEventsを入れてみたのですが、
まだうまく機能しません。
ウェイトかけるというのも、問題ですし…。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加