用Delphi写了一个Hook.DLL供PB使用。其中Hook的回调函数中有:
SendMessage(hwnd,msg,wparam,lparam);
// hwnd 是通过PB程序传递的一个窗口句柄
// msg = WM_USER + 20PB中自定义事件pbm_cumstom21(与DLL中的msg参数对应)。问题:
在PB程序拥有焦点时,DLL 中的 SendMessage 到PB程序中,能执行 pbm_custom21,
但如果PB程序无焦点时,似乎 SendMessage 没有送到 PB 程序的hwnd,没有执行pbm_custom21事件。但 SendMessage 紧跟后面的 MessageBeep(1) 执行了。SendMessage 没有执行成功?

解决方案 »

  1.   

    求各位了:跟踪发现,在 DLL 的回调函数中:如果PB程序失去焦点,用 IsWindow(hwnd) 返回 False。
    但让PB程序得到焦点后,又返回为 True 了。为什么?我在PB程序中采用Timer发现,不论得到焦点还是失去焦点,IsWindow(hwnd) 都返回 True。
      

  2.   

    这是不是所谓的DLL没有分配全局内存的原因啊?大哥大姐们?帮我!初学Delphi,很难啊?!
      

  3.   

    這樣應該是PB的問題,是它內部機制處理的問題, 或者你傳的HANDLE 不是很好
      

  4.   

    我传的 Handle 在PB程序中任何时候都是有效的。IsWindow(hwnd) = True.DLL中,跟踪发现:如果把焦点窗口改变,其HInstance也会随之改变。
    在 HookProc 回调函数中:
      ShowMessage(IntToStr(HInstance));  //焦点程序窗口改变,其值随之改变,为何?
      ShowMessage(hwnd);             //调用该DLL的PB程序,如果有焦点,则<>0,而无焦点时=0;Why?
      

  5.   

    而且,如果焦点在浏览器、Delphi等其它程序之间改变时,ShowMessage(IntToStr(HInstance)); 的结果也不一致。
      

  6.   

    不知道你是怎样得到hwnd的,函数调用顺序是不是Stdcall?