关于向另外一个应用程序发送虚拟组合快捷键。150大分耶!!!急!!(150分)

  • 主题发起人 主题发起人 arnew
  • 开始时间 开始时间
A

arnew

Unregistered / Unconfirmed
GUEST, unregistred user!
我要向另外一个程序发送虚拟的按键,目的是这样子的:<br><br>我想向IE发送Alt+left和Alt+right,使IE在人不在的时候可以<br><br>自动做“后退”和“前进”的动作。<br><br>我自己试过,在本身的程序可以实现,但是,发送到IE就不行了,我是<br><br>取得IE的handle后,用sendmessage向它发送按键信息,用spy++看<br><br>IE有收到消息,但就是没反应。试过了很多方法,就是不行。<br><br>那位高手可以帮忙一下。最好有详细的程序代码!<br><br>谢谢了!<br><br>quickly
 
GetWindowThreadProcessId<br>AttachThreadInput<br>SetKeyboardState <br>keybd_event<br>
 
发送组合键不一定成功,因为windows接收到left或right时,会看当时alt键是否<br>真的按下了(前面虽然发了alt的keydown也没用),所以组合不起来。<br>可以用spy++看看用菜单前进和后退时IE接收到的WM_COMMAND消息,然后向IE发送<br>同样的菜单消息。我刚才试了一下IE5.0,发送<br>PostMessage (hWND_IE, WM_COMMAND, $A121, 0) //后退<br>PostMessage (hWND_IE, WM_COMMAND, $A122, 0) //前进<br>都可以。
 
partisan 的方法的确可行,我先表示感谢了。<br><br>呵呵,突然间又想起一个问题,不好意思,再问一次,不会介意吧。<br><br>就是:如果我的程序不是当前活动窗口,我想控制鼠标的动作怎么做?<br><br>比方说:鼠标的移动。<br><br>不知道有没有控制鼠标移动的API?mouse_event好像不是很好发送<br><br>到外部程序阿。而postmessage能不能发送控制鼠标的消息呢?<br><br>help没找到。谢谢了。呵呵。<br><br>
 
如果我的程序不是当前活动窗口?SetFocus<br>不知道有没有控制鼠标移动的API?SetCursorPos
 
呵呵,俺恰好有一段让鼠标不定时的在屏幕上某一个区域内活动的程序,就顺便贴过来给你吧<br>看来你也是要欺骗某个网页让它觉着总有人在正常使用了。我用了两个Timer,一个定时让IE的<br>窗体最小化,另外一个让IE窗体正常并且让鼠标在它的窗体范围内部随机移动。<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var i: integer;<br>begin<br>&nbsp; Windows.ShowWindow(IE.HWND, SW_MiniMize);<br>&nbsp; Randomize;<br>&nbsp; i := Random(4);<br>&nbsp; i := 60000 + i * 10000; //随机的在1-5分钟之内最小化窗体<br>&nbsp; Timer1.Interval := i;<br>end;<br><br>procedure TForm1.Timer2Timer(Sender: TObject);<br>var x,y: integer; OldP,NewP: TPoint;<br>begin<br>&nbsp; windows.ShowWindow( IE.HWND, SW_Restore);<br>&nbsp; windows.SetForegroundWindow( IE.HWND );<br>&nbsp; OldP := mouse.CursorPos;<br>&nbsp; x := Ie.Left + IE.Width div 2; //IE窗体的中心<br>&nbsp; y := IE.Top + IE.Height div 2;<br>&nbsp; Randomize;<br>&nbsp; X := X + Random(100);<br>&nbsp; Y := Y + Random(100);<br>&nbsp; NewP.x := X;<br>&nbsp; NewP.Y := Y;<br>&nbsp; Mouse.CursorPos := NewP;<br>end;<br><br>
 
此外,如果你有IE = IWebBrowser2的指针的话, 你可以直接使用GoForward和GoBack方法实现你的第一个要求
 
&gt;&gt;&gt;
 
Thank very much
 
各位大虾,不知谁有spy++程序或知在何处下载,还请赐教!!!<br>-&gt;hhzrj@fm365.com<br>
 
To partisan:<br>&nbsp; &nbsp; 你用的<br>&nbsp; &nbsp; PostMessage (hWND_IE, WM_COMMAND, $A121, 0) //后退<br>&nbsp; &nbsp; PostMessage (hWND_IE, WM_COMMAND, $A122, 0) //前进<br>&nbsp; &nbsp; 函数中,$A121和$A122是通过Spy++所得到的Message值吗?<br>&nbsp; &nbsp; 能否用同样的方法,去获得启动桌面上某一图标的Windows的系统消息?<br><br>
 
keybd_event or other?<br>&nbsp;I forget ...
 
我怎么找不到 hWND_IE,是不是要添加什么单元
 
&nbsp; &nbsp;hWND_IE应是你自定义的一个HWND类型的变量,其值是你通过FindWindow所获得<br>的IE应用程序的窗口句柄,并不需要添加什么单元。<br>
 
IE 应用程序的句柄是什么?谢谢!
 
Function GetIE_Hand(DestString:String);<br>var<br>&nbsp; &nbsp;HWND_IE: HWnd; &nbsp;// 窗口句柄<br>&nbsp; &nbsp;WinText: array [0..255] of char;<br>begin<br>&nbsp; &nbsp; &nbsp;HWND_IE := GetWindow(HWND_IE, GW_HWNDFIRST);<br>&nbsp; &nbsp; &nbsp;// 获取第一个窗口的句柄<br>&nbsp; &nbsp; &nbsp;while HWND_IE &lt;&gt; 0 do<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 获取窗口的名称<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if GetWindowText(HWND_IE, @WinText, 255)&gt;0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( WinText=DestString) then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PostMessage (hWND_IE, WM_COMMAND, $A121, 0) //后退<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PostMessage (hWND_IE, WM_COMMAND, $A122, 0) //前进<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end; &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 获取下一个窗口的句柄<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HWND_IE:=GetWindow(HWND_IE, GW_HWNDNEXT);<br>&nbsp; &nbsp; &nbsp;end;<br>end;<br>
 
多人接受答案了。
 
后退
顶部