如何激活窗口??(100分)

  • 主题发起人 主题发起人 szchengyu
  • 开始时间 开始时间
S

szchengyu

Unregistered / Unconfirmed
GUEST, unregistred user!
请问 SetForegroundWindow 如何使用?

我本来是想防止重复启动程序,当程序第二个副本启动后,检测到第一个副本,就会调用
SetForegroundWindow, 但不能成功, 返回值 32 ,说什么共享错误?
真是搞不懂,

急哪???????????? 哪位大侠帮帮忙
 
SetActiveWindow,SetWindowPos
 
不是,是M$修改了代码,不能把窗口放到前台,只是闪动任务栏而已~~~~~~~~~~~
需要特殊处理才能做到的。我也回答过了,不贴了。
 
To: Kingron

什么意思啦........................

求求你,给点具体提示

急............
 
SetForegroundWindow中的HWND参数要填第一个副本的窗口句柄啊.我试过了没有问题啊.
 
var
; WndHandle: THandle;

...
; if FoundFirstEdition then begin
; ; WndHandle := FindWindow('TApplication', PChar(Application.Title));
; ; if WndHandle <> 0 then
; ; ; SetForegroundWindow(WndHandle);
; end;
 
我的程序有多个窗口,SetForegroundWindow的参数传为主窗口,
主窗口是可以显示出来,但不能成为键盘焦点,为什么?
 
因为它隶属于应用程序窗口(即类名为TApplication的那个窗口)。父窗口还没有激活,
子窗口何来可以接受键盘焦点呢?
 
JohnsonGuo

什么意思?
 
我这里有一篇文章,正好解决你的问题

Write by :lu0
98/2000下,有个公开的函数SetForegroundWindow,用于切换前台窗口.但是事实上,SetForegroundWindow并不能用于和其他进程的窗口协同工作,通常情况下SetForegroundWindow会调用FlashWindowEx来闪烁目标窗口,代表已经切换了窗口,但是这不是我们需要的.网络上有一些顶尖高手使用修改窗口切换的系统规则后,用SetForegroundWindow切换到其他进程的窗口,但是现在,我们有了UNDOCUMENTED的另外一个USER32函数:
SwitchToThisWindow(...);
来完成这项工作.
那么原型是怎么的呢? 下面就来揭晓了......
void WINAPI SwitchToThisWindow (
; ; ; ; ; ; ; ; ; HWND hWnd, ; // Handle to the window that should be activated
; ; ; ; ; ; ; ; ; BOOL bRestore // Restore the window if it is minimized
; ; ; ; ; ; ; ; ; );
由于没有原型和库,我们在使用时通常用动态联接法.
typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
HMODULE hUser32 = GetModuleHandle("user32");
SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
这样,我们的任务就完成了.
*******************************
从Win98开始,微软更改了系统代码,一般的SetForegroundWindow只能将
状态栏中应用按钮闪烁,并没有将应用调到最前面。请使用下列函数:

function ForceForegroundWindow(hwnd: THandle): boolean;
const
; ;SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
; ;SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
; ;timeout: DWORD;
begin
; ;if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion
> 4)) or
; ; ; ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
; ; ; ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
(Win32MinorVersion > 0)))) then begin
; ; ; SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout,
0);
; ; ; SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
TObject(0), SPIF_SENDCHANGE);
; ; ; Result := SetForegroundWindow(hWnd);
; ; ; SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
TObject(timeout), SPIF_SENDCHANGE);
; ; ; end
; ;else
; ; ; Result := SetForegroundWindow(hWnd);
end; { ForceForegroundWindow }

***********************
发现一个2000下面的方法,试一下
function ;AllowSetForegroundWindow( dwProcessId:DWORD): BOOL; stdcall;

implementation
function AllowSetForegroundWindow; external ;'user32.dll' name 'AllowSetForegroundWindow';
 
我又仔细研究了,发现我的问题其实不是不能切换应用程序的原因

详细情况如下:

我的程序设了一个快捷方式放到桌面上,该快捷方式又设了一个快捷键F2
如果不用F2启动程序(用双击快捷图标直接双击程序本身)一切正常,
切换也正常,

但如果第一次F2启动程序,则启动程序后,再按F2就不能切换

这是什么原因
 
把你截获F2这段代码贴出来看看
 
我的程序根本没有截获F2键,
问题是设置了快捷键后,系统首先获得F2这个键,好像都不传给我的程序了
 
to szchengyu:
请参考 :

http://www.delphibbs.com/delphibbs/dispq.asp?lid=609650

里面解释的很清楚了,没有必要再写出来。
 
Sorry;
我的程序还有别的问题,详细情况如下:

我的程序设了一个快捷方式放到桌面上,该快捷方式又设了一个快捷键F2
如果不用F2启动程序(双击程序本身)一切正常,
切换也正常,

但如果第一次F2启动程序,则启动程序后,再按F2就不能切换
 
谁叫你用F2了?一般都是使用一个组合键!F2在程序里面经常用到,你这样不是自讨苦吃吗?
 
我用的键盘是小键盘(20个键),只有F1-F4四个功能键,我还能用什么组合键?

不过我用变通的方法解决这个问题了:

启动程序的时候屏幕系统功能键,退出的时候再恢复,
这样我的程序里还可以多用一个功能键
 
多人接受答案了。
 
后退
顶部