【问题标题】:Force another application SendToBack强制另一个应用程序 SendToBack
【发布时间】:2016-11-12 01:12:50
【问题描述】:

我需要在申请前填写我的表格。但是,常用的方法是行不通的。

已经尝试过的方法

//method #1

PostMessage(HD, WM_USER, 0, 0);
SetWindowPos(HD, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);


//method #2
dwThreadID := GetWindowThreadProcessId(HD, nil);
dwCurrentThreadID := GetCurrentThreadId;
AttachThreadInput(dwCurrentThreadID, dwThreadID, true);
BringWindowToTop(Aff.handle);
ShowWindow(Aff.handle, SW_SHOW);

有问题的应用程序

评论

相关应用程序只能在全屏模式下运行。

我不想要完整的代码,只想要一条前进的道路。

对不起,我的英语不好,感谢您的宝贵时间。

【问题讨论】:

  • 你有 FormStyle = fsStayOnTop 吗?
  • 是的,不要只使用这个应用程序
  • 你能很好地处理高清吗??
  • 是与其他应用程序的所有方法都可以正常工作

标签: delphi


【解决方案1】:

您正在将表单设置到底部。让它成为最顶层:

SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

另一种方法,如果您真的想将外部应用程序强制到后台,您需要获取它的句柄。例如,如果这样的应用程序被命名为 calc:

hCalc := FindWindow('calc', nil); 
SendMessage(hCalc , WM_SYSCOMMAND, SC_MINIMIZE, 0); // you can also minimize the application
SetWindowPos(hCalc , HWND_BOTTOM, 0, 0, 0, 0,  SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

【讨论】:

  • 感谢尝试帮助,但不起作用。前面的应用程序都起来了,打开任务管理器他不能一直专注总是回来的。
  • 所以即使任务管理器移动到相同位置,您的应用程序也能保持在最前面?
  • 您的应用程序是否位于 VMWare Player 中,并希望它位于不在同一虚拟环境中的其他应用程序之上?也许完整的屏幕截图可以解释这种情况。
  • 但是开发应用程序是为了不把其他应用程序留在他面前。并且图像完成了我的应用程序这个全屏显示
  • 在 Windows XP 上可以保证这一点,但在较新的版本上则不行。
【解决方案2】:

你可以试试这个:

function ForceForegroundWindow(AHandle: THandle): Boolean;
var
  Input: TInput;
begin
  Result := True;

  ZeroMemory(@Input, SizeOf(Input));
  SendInput(1, Input, SizeOf(Input));
  SetForegroundWindow(AHandle);
end;

致谢来自 (How to bring my application to the front?) 的 Sertac Akyuz

【讨论】:

  • 谢谢你认为这对我有很大帮助
  • 这不应该是一个答案,而是一个引用 Sertac 答案的评论,所以 -1
  • @SertacAkyuz 抱歉,我没有找到原始线程。已添加学分。
  • @Chris - 谢谢。无论如何,我怀疑 3v3lyn 是否有一个 user32 窗口,但可能是一个 dx 表面之类的。可能此页面上的任何建议都无济于事..
猜你喜欢
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多