触发了哪个事件 有一程序A(只有一个Form)运行在桌面最上层,现在最小化(或其他动作,只要保证程序A仍处于最上层即可)其他程序,如资源管理器等,希望知道这个动作会触发程序A的什么事件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TopMost=true???其他程序最小化,和A程序有什么关系? 没办法检测。刚才我用spy++试了,如果这个最小化的窗口在这个窗口的下方(即至少有一部分被覆盖),那么产生了如下windows消息:/*<00001> 002301FA S WM_WINDOWPOSCHANGING lpwp:0498EAB4<00002> 002301FA R WM_WINDOWPOSCHANGING<00003> 002301FA S WM_WINDOWPOSCHANGED lpwp:0498EAB4<00004> 002301FA R WM_WINDOWPOSCHANGED<00005> 002301FA S WM_ACTIVATEAPP fActive:True dwThreadID:0000168C<00006> 002301FA R WM_ACTIVATEAPP<00007> 002301FA S WM_NCACTIVATE fActive:True<00008> 002301FA R WM_NCACTIVATE<00009> 002301FA S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)<00010> 000A0BEA S WM_IME_SETCONTEXT fSet:1 iShow:C000000F<00011> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000<00012> 000A0BEA R WM_IME_NOTIFY<00013> 000A0BEA R WM_IME_SETCONTEXT<00014> 000A0BEA S WM_SETFOCUS hwndLoseFocus:(null)<00015> 002301FA S WM_CTLCOLORBTN hdcButton:7001111F hwndButton:000A0BEA<00016> 002301FA R WM_CTLCOLORBTN hBrush:01900015<00017> 000A0BEA S WM_GETTEXTLENGTH<00018> 000A0BEA R WM_GETTEXTLENGTH cch:9<00019> 000A0BEA S WM_GETTEXT cchTextMax:20 lpszText:0498D510<00020> 000A0BEA R WM_GETTEXT cchCopied:9 lpszText:0498D510 ("c")<00021> 002301FA S WM_DRAWITEM idCtl:658410 lpdis:0498DCF4<00022> 000A0BEA S message:0x202B [User-defined:WM_USER+7211] wParam:000A0BEA lParam:0498DCF4<00023> 000A0BEA R message:0x202B [User-defined:WM_USER+7211] lResult:00000000<00024> 002301FA R WM_DRAWITEM fProcessed:False<00025> 000A0BEA R WM_SETFOCUS<00026> 002301FA R WM_ACTIVATE<00027> 000A0BEA P WM_PAINT hdc:00000000<00028> 002301FA S WM_NCACTIVATE fActive:False<00029> 002301FA R WM_NCACTIVATE fDeactivateOK:True<00030> 002301FA S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)<00031> 002301FA R WM_ACTIVATE<00032> 002301FA S WM_ACTIVATEAPP fActive:False dwThreadID:00000C28<00033> 002301FA R WM_ACTIVATEAPP<00034> 000A0BEA S WM_KILLFOCUS hwndGetFocus:(null)<00035> 000A0BEA R WM_KILLFOCUS<00036> 000A0BEA S WM_IME_SETCONTEXT fSet:0 iShow:C000000F<00037> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_CLOSESTATUSWINDOW dwCommand:00000001 dwData:00000000<00038> 000A0BEA R WM_IME_NOTIFY<00039> 000A0BEA R WM_IME_SETCONTEXT<00040> 000A0BEA P WM_PAINT hdc:00000000*/本来我以为其中的消息产生序列和WinUser+7211可以做一点文章,但后来我试着用另外一个完全不被覆盖的窗口执行最,SPY++没有任何输出。 [DllImport("user32.dll", EntryPoint="IsIconic")]public static extern int IsIconic ( int hwnd);使用IsIconic判断窗口是否最小化了 using System;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace WindowsApplication3{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern int FindWindow( string lpClassName, string lpWindowName ); [DllImport("user32.dll", EntryPoint = "IsIconic")] public static extern int IsIconic( int hwnd ); private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; int h = FindWindow("SciCalc", "计算器"); if (h != 0) { this.TopMost =IsIconic(h)==1?true:false; } timer1.Enabled = true; } private void Form1_Load(object sender, EventArgs e) { System.Diagnostics.Process.Start("calc.exe"); timer1.Interval = 1000; timer1.Enabled = true; timer1.Tick += new EventHandler(timer1_Tick); } }} 对了,我没做过HOOK,但应该可以HOOK窗口的最小化事件的。这应该可以做得到。ZengHD的方法是使用程序的方法循环检测最小化的窗口,但是你必须要知道系统中有多少应用程序才行。如果你启动了其它的窗口,而没有在你的检测队列中,你将无法查询到这个消息。另外你也需要维持一个队列,以知道这个窗口的状态。否则,最小化的窗口将持续的收到最小化的状态消息,因为IsIocnic将始终返回TRUE。 7楼的方法好像不行。只是为了达到我2楼所说的效果,没办法,只有换一种思路,简单点用一个Timer来不停的刷基本达到了我的目的。 我的代码就是使用Timer,怎么会没有效果呢? To 12楼就如phy在11所说,当前系统中可能有很多应用程序。我用Timer是不停的Paint画面。 C#创建对象 C# WinForm如何显示3DMax文件? SharpZipLib怎么压缩目录 如何简洁的判断excel单元格的数据类型? 关于wince中rda同步的问题,请高手帮忙! NotifyIcon的图标为什么在win2000系统下会失真呢? ODBC连接 100分求acrobat sdk或C#例子。加急!!!!!! C# 如何写一个类似ListBox的控件? 打印机问题 c#动态生成字段后赋值问题?不要告诉我是循环
其他程序最小化,和A程序有什么关系?
刚才我用spy++试了,如果这个最小化的窗口在这个窗口的下方(即至少有一部分被覆盖),那么产生了如下windows消息:/*<00001> 002301FA S WM_WINDOWPOSCHANGING lpwp:0498EAB4
<00002> 002301FA R WM_WINDOWPOSCHANGING
<00003> 002301FA S WM_WINDOWPOSCHANGED lpwp:0498EAB4
<00004> 002301FA R WM_WINDOWPOSCHANGED
<00005> 002301FA S WM_ACTIVATEAPP fActive:True dwThreadID:0000168C
<00006> 002301FA R WM_ACTIVATEAPP
<00007> 002301FA S WM_NCACTIVATE fActive:True
<00008> 002301FA R WM_NCACTIVATE
<00009> 002301FA S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
<00010> 000A0BEA S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00011> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
<00012> 000A0BEA R WM_IME_NOTIFY
<00013> 000A0BEA R WM_IME_SETCONTEXT
<00014> 000A0BEA S WM_SETFOCUS hwndLoseFocus:(null)
<00015> 002301FA S WM_CTLCOLORBTN hdcButton:7001111F hwndButton:000A0BEA
<00016> 002301FA R WM_CTLCOLORBTN hBrush:01900015
<00017> 000A0BEA S WM_GETTEXTLENGTH
<00018> 000A0BEA R WM_GETTEXTLENGTH cch:9
<00019> 000A0BEA S WM_GETTEXT cchTextMax:20 lpszText:0498D510
<00020> 000A0BEA R WM_GETTEXT cchCopied:9 lpszText:0498D510 ("c")
<00021> 002301FA S WM_DRAWITEM idCtl:658410 lpdis:0498DCF4
<00022> 000A0BEA S message:0x202B [User-defined:WM_USER+7211] wParam:000A0BEA lParam:0498DCF4
<00023> 000A0BEA R message:0x202B [User-defined:WM_USER+7211] lResult:00000000
<00024> 002301FA R WM_DRAWITEM fProcessed:False
<00025> 000A0BEA R WM_SETFOCUS
<00026> 002301FA R WM_ACTIVATE
<00027> 000A0BEA P WM_PAINT hdc:00000000
<00028> 002301FA S WM_NCACTIVATE fActive:False
<00029> 002301FA R WM_NCACTIVATE fDeactivateOK:True
<00030> 002301FA S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
<00031> 002301FA R WM_ACTIVATE
<00032> 002301FA S WM_ACTIVATEAPP fActive:False dwThreadID:00000C28
<00033> 002301FA R WM_ACTIVATEAPP
<00034> 000A0BEA S WM_KILLFOCUS hwndGetFocus:(null)
<00035> 000A0BEA R WM_KILLFOCUS
<00036> 000A0BEA S WM_IME_SETCONTEXT fSet:0 iShow:C000000F
<00037> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_CLOSESTATUSWINDOW dwCommand:00000001 dwData:00000000
<00038> 000A0BEA R WM_IME_NOTIFY
<00039> 000A0BEA R WM_IME_SETCONTEXT
<00040> 000A0BEA P WM_PAINT hdc:00000000
*/
本来我以为其中的消息产生序列和WinUser+7211可以做一点文章,但后来我试着用另外一个完全不被覆盖的窗口执行最,SPY++没有任何输出。
public static extern int IsIconic (
int hwnd
);使用IsIconic判断窗口是否最小化了
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;namespace WindowsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} [DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(
string lpClassName,
string lpWindowName
); [DllImport("user32.dll", EntryPoint = "IsIconic")]
public static extern int IsIconic(
int hwnd
); private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
int h = FindWindow("SciCalc", "计算器");
if (h != 0)
{
this.TopMost =IsIconic(h)==1?true:false;
}
timer1.Enabled = true;
} private void Form1_Load(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("calc.exe");
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Tick += new EventHandler(timer1_Tick);
}
}
}