求助,如何编写程序把一个始终抢占前台的程序最小化。(300分)

  • 主题发起人 主题发起人 FLY_IN_SKY
  • 开始时间 开始时间
F

FLY_IN_SKY

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在玩一个网络游戏,在切换的时候能回到桌面,但是它马上又自动切换回去,
表现的状况就是屏幕闪一下,但是切换不了。这样,在玩游戏的时候就无法做别的事情,
尤其是老板来了也没办法。
是否能写个软件放在后台,在游戏的时候按一个热键就能把它最小化,并能够进行window的其他任务。

能够提供代码最好,提供资料帮助我自己编写也给分,或者提供相关软件也可
先上300分,如果能圆满解决,再加多少也无所谓(我还有2900可用分) 谢谢!
 
你找到那个窗口的handle,然后用 API
ShowWindow(handle,sw_hide)把它隐藏试试.
 
不好意思,我水平不够,而且我的工作都是写数据库的,系统方面没接触,能否详细点?谢谢。
如果觉得分不够,可以再加。
 
procedure TForm1.Button1Click(Sender: TObject);
var myhandle : hwnd;
windowtitle:string;
begin
windowtitle := '大富翁论坛'; //你要查找的窗口的标题
myhandle := findwindow(nil,pchar(windowtitle));
if myhandle<>0 then
showwindow(myhandle,sw_hide);// sw_hide 为隐藏窗口
// SW_SHOW 为显示窗口
end;
 
我先试试看,谢谢。
 
上面两位说的很正确,你可以利用showwindow这个函数来对其他窗口进行操作。不过如果你想
在玩游戏时你想操作自如的话,你就必须在系统里注册一个快捷键。
我的方法是利用hook来在系统中放一个全局的钩子,然后他就可以监视你的热键啦。当你在玩游戏时
看到老板来的时候,你在键盘上按ctrl+h就隐藏目标,ctrl+s就显示目标,很方便的。
钩子的代码如下: hook.dll

library hook;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Windows,
messages,
Classes;

{$R *.RES}
const
KeyPressMask=0x80000000; //键盘掩码常量
CM_MYMessage = WM_USER + $1000;
var
HookKeyBoard: HHook;
MyHandle,FileM: THandle;
PReceptor: ^Integer;
Hidefile:string;
//读取文件信息
function GetTextFromFile(AFile : String; var ReturnString : string) : boolean;
var
FileStream : TFileStream;
begin
result := false;
if not fileexists(AFile) then exit;
FileStream := TFileStream.Create(AFile,fmOpenRead);
try
if FileStream.Size > 0 then
begin
SetLength(ReturnString,FileStream.Size);
FileStream.Read(ReturnString[1],FileStream.Size);
result := true;
end;
finally
FileStream.Free;
end;
end;

function CallBackKeyHook(Code: Integer; msg: WPARAM; keyhook: LPARAM): LRESULT;stdcall;
var
HHandle:Thandle;
i:integer;
begin
Result := 0;
If Code < 0 Then
begin
result:=callnexthookex(hookkeyboard,code,msg,keyhook);
Exit;
end;

if ((keyhook) and (KeyPressMask) = 0) and(GetKeyState(vk_Control) < 0) and (msg= Ord('H')) then
begin
Result := 1;
Hhandle:=findwindow(nil,pchar(Hidefile));
showwindow(HHandle,SW_hide);
end;

if ((keyhook) and (KeyPressMask) = 0) and(GetKeyState(vk_Control) < 0) and (msg= Ord('S')) then
begin
Result := 1;
Hhandle:=findwindow(nil,Pchar(Hidefile));
showwindow(HHandle,SW_Normal);
end;
end;

procedure HookOff; stdcall;
begin
UnHookWindowsHookEx(HookKeyBoard);
end;

procedure HookOn; stdcall;
var
str,filename:string;
position:integer;
begin
filename:=getcurrentdir+'HideExe.ini';
if GetTextFromFile(filename,Str) then
Hidefile:=trim(str);
HookKeyBoard := SetWindowsHookEx(WH_KEYBOARD, @CallBackKeyHook, HInstance, 0);
end;

exports
HookOn, HookOff;
begin
end.

你可以在上面稍加扩充就可以做成一个非常棒的东东啦,至于调用这个hook.dll的函数不要我
说了吧。
你做一个exe文件,在设一下Application.ShowMainForm:=false;在create事件中加入调用hook.dll
中的hookon函数就可以啦。
很easy吧/俺玩星际就用这东西:)不要对俺领导说哦/


 
补充点东西
var
HHandle:THandle;
HHandle:=findwindow(nil,'游戏在状态栏的名称') 即窗体的caption.

最小化是用showwindow(HHandle,SW_MINIMIZE),
最大化是用showwindow(HHandle,SW_MAXIMIZE),
我里面写的是showwindow(HHandle,SW_NORMAL),你也可以改成showwindow(HHandle,SW_SHOW);
ShowWindow参数详细请看WinSdk Help?

 
告诉你个最完美,最简单的方法,去下载个金山游侠2002,在设置选项有
个老板屏幕功能,上面有excel,word等屏幕,还可以自己定义屏幕。
想想吧,老板来了,一按alt+c键,屏幕就变成delphi的IDE。
此为完美方案,还不用编程,快快给分。
 
谢谢各位的帮忙,用hook实现热键我已经会了,然后用showwindow把这个游戏最小化也没有问题。
现在的问题是他最小化以后会立刻自动恢复到前台,不知道该如何解决啊。
 
to zhengct
金山游侠试了,这个游戏会自动恢复到前台,没用啊。哎。本来玩得好好的,为了屏蔽封包作弊,
他就改成这个破样子,气死了。
 
哈哈,最佳解决方案来了,不会系统级编程也没关系:)

http://www.8848soft.com/download1/multidesktop_setup.exe
Multi Desktop,挺好用的
(装好以后用CTRL-F1,F2,F3,F4切换)
 
to 轻松虎
不好使

谢谢大家的参与,就算解决不了也都会给分的。
 
我学了点东西谢谢
 
爽呀,救星
 
没人能帮我吗?
把那个程序的进程暂停可能嘛?
 
你把它用sw_hide参数隐藏不行吗,显示的时候再用sw_show;非得用最小化?
 
hide试过,不行,他还是要显示出来。
 
那么你就改变他的大小,SetWindowLong
 
用API首先要获得窗口句柄,
可以试试 showwindow(theHandle,SW_MINIMIZE);
showwindow(theHandle,SW_HIDE);
我以前做过用来关闭广告窗口。
 
SetWindowLong不会用,请详细说明,谢谢。
 
后退
顶部