触发了哪个事件

dongshanyu 2008-10-16 04:59:11
有一程序A(只有一个Form)运行在桌面最上层,
现在最小化(或其他动作,只要保证程序A仍处于最上层即可)其他程序,如资源管理器等,
希望知道这个动作会触发程序A的什么事件。

...全文
245 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongshanyu 2008-10-16
  • 打赏
  • 举报
回复
To 12楼

就如phy在11所说,当前系统中可能有很多应用程序。

我用Timer是不停的Paint画面。
ZengHD 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dongshanyu 的回复:]
7楼的方法好像不行。

只是为了达到我2楼所说的效果,没办法,只有换一种思路,简单点用一个Timer来不停的刷基本达到了我的目的。
[/Quote]
我的代码就是使用Timer,怎么会没有效果呢?
dongshanyu 2008-10-16
  • 打赏
  • 举报
回复
7楼的方法好像不行。

只是为了达到我2楼所说的效果,没办法,只有换一种思路,简单点用一个Timer来不停的刷基本达到了我的目的。
brallow 2008-10-16
  • 打赏
  • 举报
回复
对了,我没做过HOOK,但应该可以HOOK窗口的最小化事件的。这应该可以做得到。

ZengHD的方法是使用程序的方法循环检测最小化的窗口,但是你必须要知道系统中有多少应用程序才行。如果你启动了其它的窗口,而没有在你的检测队列中,你将无法查询到这个消息。另外你也需要维持一个队列,以知道这个窗口的状态。否则,最小化的窗口将持续的收到最小化的状态消息,因为IsIocnic将始终返回TRUE。

bao_yan 2008-10-16
  • 打赏
  • 举报
回复

啊. 学习!

JeffChung 2008-10-16
  • 打赏
  • 举报
回复
没有什么消息会发给A的……

ZengHD 2008-10-16
  • 打赏
  • 举报
回复
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);
}
}
}
dongshanyu 2008-10-16
  • 打赏
  • 举报
回复
楼上,这如何判断?

还有一个问题就是鼠标操作其他程序但程序A能处于最上层(程序A没有设置必须处于最上层),除了最小化动作外,不知道是否还有其他动作。
ZengHD 2008-10-16
  • 打赏
  • 举报
回复
[DllImport("user32.dll", EntryPoint="IsIconic")]
public static extern int IsIconic (
int hwnd
);

使用IsIconic判断窗口是否最小化了

brallow 2008-10-16
  • 打赏
  • 举报
回复
没办法检测。
刚才我用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++没有任何输出。
ZengHD 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dongshanyu 的回复:]
程序A的背景要截其背后的屏幕,其他程序最小化,导致程序A的背景发生变化
[/Quote]

其他程序最小化,估计A不会触发事件,但可以在A里判断其他程序是否最小化了
dongshanyu 2008-10-16
  • 打赏
  • 举报
回复
程序A的背景要截其背后的屏幕,其他程序最小化,导致程序A的背景发生变化
ZengHD 2008-10-16
  • 打赏
  • 举报
回复
TopMost=true???
其他程序最小化,和A程序有什么关系?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧