我在屏幕上用了一个半透明的窗口来来提示信息,但我希望用户可以点击半透明窗口覆盖的窗口上面的控件,也就是当这个半透明窗口不存在.可以做到吗?要能的话应该怎么做?请高手指教.

解决方案 »

  1.   

    hwindow是要接收鼠标事件的窗口句柄
      Postmessage(hwindow,WM_MOUSEMOVE,0,MakeLong(320,240));
      sleep(20);
      PostMessage(hwindow,WM_LBUTTONUP,0,0);
      sleep(20);
      PostMessage(hwindow,WM_LBUTTONDOWN,0,0); 
    这样的话就OK了
      

  2.   

    我这里有一段程序,是抓图的,可以抓某一桌面控件,是先隐藏主程序(可以看作你的半透明的窗口),再显示桌面(看作你的半透明窗口所覆盖的窗口),然后获得鼠标所点控件的句柄,再获得句柄的控件大小等:
    procedure TForm1.REGIN2Click(Sender: TObject);
    begin
     form1.Hide;//本程序主窗体(你的半透明的窗口)
     form3.hide;//装载IMAGE的窗体FORM3隐藏,显示桌面(看作你的半透明窗口所覆盖的窗口)
     form3.Timer1.Enabled:=true;
    end;
    --------------
    procedure TForm3.Timer1Timer(Sender: TObject);
    var po:tpoint;
    wnd:hwnd;
    BB:TBitmap;
    CC:TCanvas;    
    dc:hdc;
    begin
      timer1.Enabled:=false;   //取消时钟
      getcursorpos(po) ;//获得鼠标坐标        
      wnd:=windowFromPoint(po);//可以通过鼠标获得所在窗口句柄
      GetWindowRect(wnd,r) ;
      dc:=GetDC(0);
      CC:= TCanvas.Create;
      CC.Handle:= dc;
    。。            
      form3.WindowState:=wsMaximized;    
      form3.show;                     
      messagebeep(1);
    end;
      

  3.   

    可以使用下面的api获得下层窗口的句柄
    nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT);
      

  4.   

    to: hkbarton(宁静至远)(西南交大) 
    >>>nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT);
    能不能具体一点,如果下层窗口有2个,那么取到的是什么?
    MSDN上说是按Z-ORDER取,这样如果窗口平铺的话肯定不能取到正确的窗口;
    而且这个提示窗口一般都是置顶的,用这个方法看来不是很好.form(form) 的方法有点投机取巧了,效果可能不会很好
      

  5.   

    得到窗口的句柄的方法有很多如果是同一个应用程序可以用form1.handle,不是则可以用findwindow,你可以一层一层找,首先忽略你那个半透明的窗口,然后找最上面的那个窗体不就行了
      

  6.   

    我是思路是,在你的程序窗口的MouseDown事件中写代码:
    1.得到鼠标的当前位置
    2.程序窗口隐藏
    3.获得目标窗口句柄
    4.转换为目标窗口的坐标
    5.发送WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP消息
    6,显示程序窗口代码如下:(不好意思,我还没有装DELPHI,只好用BC代替了)
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
            TPoint mypoint;
            TPoint spoint;
            GetCursorPos(&spoint)
            Form1->Hide();
            HWND hwnd=WindowFromPoint(spoint);
            mypoint=ScreenToClient(spoint);
            PostMessage(hwnd,WM_MOUSEMOVE,0,MAKEWORD(mypoint.x,mypoint.y));
            PostMessage(hwnd,WM_LBUTTONDOWN,0,0);
            PostMessage(hwnd,WM_LBUTTONUP,0,0);
            Form1->Show();
    }