如何拖动一个外部程序的窗口(200)

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

anselace

Unregistered / Unconfirmed
GUEST, unregistred user!
已经运行的一个外部程序,如何通过delphi代码实现按键模拟鼠标拖动该程序的窗口的操作。比如:我前台正在运行word程序,这时,只要我要按下ctrl+方向键,就拖动word的窗口移动。
 
提供另外一种思路,看看是否可行。通过findwindow找到那个word程序,调用GetWindowRect得到当前程序的显示范围,调用MoveWindow或者SetWindowPos设置窗口新的显示位置。-----------------------------------------查找窗体 FindWindow(类名,窗体Caption); Var H:HWND; lpClassName:PChar; begin H:=FindWindow(nil,'SQL Explorer'); if H<>0 then begin lpClassName:=StrAlloc(30); GetClassName(H, lpClassName, 30); ShowMessage(StrPas(lpClassName)); StrDispose(lpClassName); end; end;---------------procedure TForm1.Button1Click(Sender: TObject);var lpRect: TRect;begin Windows.GetWindowRect( Self.Handle,lpRect); MoveWindow( self.Handle, lpRect.Left, lpRect.Top, 200, 200, true);end;
 
这办法我想过,谢谢你!肯定你会有分。不过,当word程序处于当前操作的时候,delphi程序就失去焦点了,接收不到我的按键操作了。在word里面还是不能实现。
 
注册成服务
 
你想在word里面完成这个操作?可能需要一个Hook钩子,来拦截你的键盘事件。对于Hook,我只是了解一些,目前还无法给你提供帮助。
 
znxia加个键盘钩子,就可以实现了附个我以前做的键盘钩子的程序让你参考一下{问题:我想让我的程序在运行时暂停下来,按任意键继续。如何做?项目:此程序就是为了这个目的而写的作者:阿永说明:由于要考虑到程序在任何情况下都能正常工作,所以采用钩 子技术来实现.}var Form1: TForm1; HookID: HHOOK; //记录钩子的ID号,以便能够释放钩子 PassKey: Boolean; //用于记录按键状态const WH_KEYBOARD_LL = 13;implementation{$R *.dfm}function LowLevelKeyboardProc(code: Integer; wparam: wparam; lparam: lparam): LRESULT stdcall;//钩子回调函数,具体资料参阅CSDNbegin Result := 1; //为了使按键不影响到其它控件,所以将返回值设为1,不让消息下传 if (code = 0) and (GetActiveWindow() = Form1.Handle) then PassKey := True; //发生按键时改变状态,修改此处可以 if GetActiveWindow() <> Form1.Handle then Result := CallNextHookEx(0, code, wparam, lparam); //当前窗口不活动时,将消息下传给其它程序。end;procedure WaiteKey();begin HookID := SetWindowsHookExW(WH_KEYBOARD_LL, @LowLevelKeyboardProc, Hinstance, 0); //创建钩子 while not PassKey do Application.HandleMessage//等待按键 PassKey := False; if HookID <> 0 then UnhookWindowsHookEx(HookID); //释放钩子end;procedure TForm1.Button1Click(Sender: TObject);var i: Integer;begin Memo1.Clear; Memo1.SetFocus; //为了测试所述功能,故将光标定在Memo控件上 for i := 0 to 1000 do begin Memo1.Lines.Add(Format('第%d行', )); if i = 500 then begin Memo1.Lines.Add('按任意键继续'); WaiteKey(); end end; ShowMessage('OK');end;
 
delphi向系统申请热键,当系统接收到此热键的时候就自动执行delphi程序的代码功能,功能在参照znxia的方法,从而实现你想要的
 
没有找到合适的答案,先散分,再开贴1000分求全代码
 
多人接受答案了。
 
后退
顶部