如何使鼠标点击穿透窗口,点到下层窗口? 我在屏幕上用了一个半透明的窗口来来提示信息,但我希望用户可以点击半透明窗口覆盖的窗口上面的控件,也就是当这个半透明窗口不存在.可以做到吗?要能的话应该怎么做?请高手指教. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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了 我这里有一段程序,是抓图的,可以抓某一桌面控件,是先隐藏主程序(可以看作你的半透明的窗口),再显示桌面(看作你的半透明窗口所覆盖的窗口),然后获得鼠标所点控件的句柄,再获得句柄的控件大小等: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; 可以使用下面的api获得下层窗口的句柄nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT); to: hkbarton(宁静至远)(西南交大) >>>nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT);能不能具体一点,如果下层窗口有2个,那么取到的是什么?MSDN上说是按Z-ORDER取,这样如果窗口平铺的话肯定不能取到正确的窗口;而且这个提示窗口一般都是置顶的,用这个方法看来不是很好.form(form) 的方法有点投机取巧了,效果可能不会很好 得到窗口的句柄的方法有很多如果是同一个应用程序可以用form1.handle,不是则可以用findwindow,你可以一层一层找,首先忽略你那个半透明的窗口,然后找最上面的那个窗体不就行了 我是思路是,在你的程序窗口的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();} 09年第一问:程序窗体最大化问题 用IDHTTP下载怎么样取得文件名? 如何将做好的窗体做日后用? 怎么关闭Table? 这个简单的问题 如何动态添加treeview控件的节点 刚学DELPHI,在线等待求救一个简单问题 关于webbrowser控件? 关于系统的问题! Delphi的总设计师都跳槽到MS开发.net去了,delphi前途渺茫 主从表结构中,主表和从表通过一id号关联,如果主表改变了原来已有记录的id号,那么从表的id号如何才能合理地更新为新的id号? DELPHI作为一种通用的软件开发工具有哪些主要的优点和不足
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了
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;
nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT);
>>>nextWnd:=GetNextWindow(application.Handle,GW_HWNDNEXT);
能不能具体一点,如果下层窗口有2个,那么取到的是什么?
MSDN上说是按Z-ORDER取,这样如果窗口平铺的话肯定不能取到正确的窗口;
而且这个提示窗口一般都是置顶的,用这个方法看来不是很好.form(form) 的方法有点投机取巧了,效果可能不会很好
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();
}