国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C# > 正文

使用C#開發(fā)檢測并關(guān)閉彈出窗口的方法

2023-05-10 18:49:24
字體:
供稿:網(wǎng)友

本文給出了開發(fā)關(guān)閉彈出窗口的方法。

基本原理:本系統(tǒng)可以自動關(guān)閉IE彈出窗口的程序,它工作在系統(tǒng)的托盤中,按照一定的間隔來檢測IE窗口,然后關(guān)閉彈出窗體。最后,還提供了用熱鍵來殺掉彈出窗口的功能。

具體內(nèi)容如下: 

系統(tǒng)托盤

程序切換

計(jì)時(shí)控件

查找窗口

系統(tǒng)熱鍵

生成一個(gè)系統(tǒng)托盤程序

首先,產(chǎn)生一個(gè)新的C# Windows Form程序,將NotifyIcon控件從工具箱中拖到窗體中:

在C# windows Form程序中添加托盤

為了保證系統(tǒng)托盤的圖標(biāo)和應(yīng)用程序的圖標(biāo)一致,我們用一個(gè)共同的圖標(biāo)文件a.ico來設(shè)置系統(tǒng)托盤的圖標(biāo)和應(yīng)用程序的圖標(biāo)。

為了使程序不顯示在工具欄上,我們可以設(shè)置窗體的visible屬性為false. 這個(gè)可以在窗體屬性窗口中直接實(shí)現(xiàn)。

this.ShowInTaskbar = false;

到目前為止,系統(tǒng)托盤已基本好了,但是我們還沒有設(shè)置右鍵菜單,也沒有使程序顯示和隱藏的功能。

程序切換

首先,程序的主窗體可以根據(jù)不同的狀態(tài)來選擇顯示或者是隱藏,除此之外,我們可以用WindowState設(shè)置窗體的狀態(tài): 

public void HideApp()
{
this.WindowState = FormWindowState.Minimized;
Hide();
}
public void ShowApp()
{
Show();
this.WindowState = FormWindowState.Normal;
}

一個(gè)非常有趣的功能是讓用戶關(guān)閉窗體的時(shí)候程序并不是退出,為了實(shí)現(xiàn)這個(gè)功能,我們必須要重寫窗體的OnClosing事件。

protected override void OnClosing(CancelEventArgs e)
{
// 用最小化來代替關(guān)閉操作d
e.Cancel = true;
// 最小化,并且隱藏窗體
this.WindowState = FormWindowState.Minimized;
Hide();
}
當(dāng)然,我們必須要提供一個(gè)必須的退出方法.這個(gè)可以在托盤的右鍵菜單的exit中實(shí)現(xiàn),
private void menu_App_Exit(object sender, System.EventArgs e)
{
NativeWIN32.UnregisterHotKey(Handle, 100);
//隱藏托盤
notifyIcon1.Visible = false;
Application.Exit();
}

添加右鍵菜單

添加一個(gè)右鍵菜單和添加托盤基本一樣,從工具箱中添加context menu就可以.右鍵菜單在你鼠標(biāo)右鍵按下的時(shí)候是會自動彈出的。

當(dāng)設(shè)置好右鍵菜單以后,我們必要要根據(jù)不同的情況來啟用或停用右鍵菜單,這個(gè)可以通過在菜單的BeforePopup設(shè)置。Enabled屬性來實(shí)現(xiàn)。 

private void menu_App_BeforePopup(object sender, System.EventArgs e)
{
if ( this.WindowState == FormWindowState.Minimized )
{
App_Show.Enabled = true;
App_Hide.Enabled = false;
}
else
{
App_Show.Enabled = false;
App_Hide.Enabled = true;
}
}

計(jì)時(shí)工具

.Net Framework的 Timer能和系統(tǒng)的Win32 timer實(shí)現(xiàn)一樣的功能。我們要做的就是設(shè)置一個(gè)timer,然后合理的設(shè)置屬性。

m_Timer = new System.Timers.Timer(); // explicit namespace (Timer also in System.Threading)
m_Timer.Elapsed += new ElapsedEventHandler(OnTimerKillPopup);
m_Timer.Interval = m_nInterval; // for instance 3000 milliseconds
m_Timer.Enabled = true; // start timer

protected void OnTimerKillPopup(Object source, ElapsedEventArgs e)
{
m_Timer.Enabled = false; // pause the timer

FindPopupToKill();

m_Timer.Enabled = true;
}

本地win32窗體查找

本程序的實(shí)現(xiàn)原理是這樣,先檢查所有的IE窗口標(biāo)題,然后于已經(jīng)有的列表來比較,如果有相同的,我們就關(guān)閉這個(gè)窗口。

按照上面的方法,我們每n妙使用KillPopup()來檢查。比較遺憾的是我們無法使用安全代碼來完成所有的工作。我們可以使用 System.Diagnostics.Proces來檢查所有的IE進(jìn)程,然后得到主窗體。但是每一個(gè)IE進(jìn)程可以打開好幾個(gè)窗口,雖然每一個(gè)窗體都于一個(gè)進(jìn)程相關(guān),但是還沒有辦法來使每一個(gè)窗體于進(jìn)程對應(yīng)起來。

一個(gè)可行的辦法使用System.Diagnostics.Process列舉出所有的運(yùn)行的進(jìn)程,然后System.Diagnostics.ProcessThreadCollection 來得到他們的.Threads屬性,為了得到thread Id,我們使用Win32 API EnumThreadWindows(DWORD threadId,WNDENUMPROC lpfn,LPARAM lParam) 來實(shí)現(xiàn),這是一個(gè)回調(diào)(call back)函數(shù),他可以列舉出于進(jìn)程相關(guān)的窗體。當(dāng)我們得到了窗體的句柄以后,我們可以使用另一個(gè)API函數(shù) GetWindowText(HWND hwnd,/*out*/LPTSTR lpString,int nMaxCount)來得到窗體的標(biāo)題,然后根據(jù)已經(jīng)有的窗體,調(diào)用API函數(shù)SendMessage(HWND hWnd,int msg,int wParam,int lParam)來關(guān)閉窗口。下面使演示代碼 

Process[] myProcesses = Process.GetProcessesByName("IEXPLORE");

foreach(Process myProcess in myProcesses)
{
FindPopupToKill(myProcess);
}

protected void FindPopupToKill(Process p)
{
// traverse all threads and enum all windows attached to the thread
foreach (ProcessThread t in p.Threads)
{
int threadId = t.Id;

NativeWIN32.EnumThreadProc callbackProc =
new NativeWIN32.EnumThreadProc(MyEnumThreadWindowsProc);
NativeWIN32.EnumThreadWindows(threadId, callbackProc, IntPtr.Zero /*lParam*/);
}
}

// callback used to enumerate Windows attached to one of the threads
bool MyEnumThreadWindowsProc(IntPtr hwnd, IntPtr lParam)
{
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;


// get window caption
NativeWIN32.STRINGBUFFER sLimitedLengthWindowTitle;
NativeWIN32.GetWindowText(hwnd, out sLimitedLengthWindowTitle, 256);

String sWindowTitle = sLimitedLengthWindowTitle.szText;
if (sWindowTitle.Length==0) return true;

// find this caption in the list of banned captions
foreach (ListViewItem item in listView1.Items)
{
if ( sWindowTitle.StartsWith(item.Text) )
NativeWIN32.SendMessage(hwnd, NativeWIN32.WM_SYSCOMMAND,
NativeWIN32.SC_CLOSE,
IntPtr.Zero); // try soft kill
}

return true;
}

public class NativeWIN32
{
public delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam);

// used for an output LPCTSTR parameter on a method call
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public struct STRINGBUFFER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
public string szText;
}

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
}

上面的方法在性能上是不錯(cuò)的,因?yàn)樗^濾了其他非IE的窗口.但是我們可以用一個(gè)更簡單的方法來實(shí)現(xiàn),就是調(diào)用API FindWindowEx(HWND hWndParent, HWND hWndNext, /*in*/LPCTSTR szClassName, /*in*/LPCTSTR szWindowTitle)方法.比較有用的是這句,我們可以使用registered window class name來找到IE窗口(IEFrame是所有打開的IE的標(biāo)識). 

protected void FindPopupToKill()
{
IntPtr hParent = IntPtr.Zero;
IntPtr hNext = IntPtr.Zero;
String sClassNameFilter = "IEFrame"; // 所有IE窗口的類
do
{
hNext = NativeWIN32.FindWindowEx(hParent,hNext,sClassNameFilter,IntPtr.Zero);

// we've got a hwnd to play with
if ( !hNext.Equals(IntPtr.Zero) )
{
// get window caption
NativeWIN32.STRINGBUFFER sLimitedLengthWindowTitle;
NativeWIN32.GetWindowText(hNext, out sLimitedLengthWindowTitle, 256);

String sWindowTitle = sLimitedLengthWindowTitle.szText;
if (sWindowTitle.Length>0)
{
// find this caption in the list of banned captions
foreach (ListViewItem item in listView1.Items)
{
if ( sWindowTitle.StartsWith(item.Text) )
NativeWIN32.SendMessage(hNext, NativeWIN32.WM_SYSCOMMAND,
NativeWIN32.SC_CLOSE,
IntPtr.Zero); // try soft kill
}
}
}
}
while (!hNext.Equals(IntPtr.Zero));

}

public class NativeWIN32
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr parent /*HWND*/,
IntPtr next /*HWND*/,
string sClassName,
IntPtr sWindowTitle);

}

注冊系統(tǒng)熱鍵

系統(tǒng)熱鍵用在像彈出窗口殺手這種應(yīng)用程序非常有用, Ctrl+Shift+J是缺省熱鍵。

說道實(shí)現(xiàn),我們繼續(xù)用RegisterHotkey(HWND hWnd, int id, UINT fsModifiers, UINT vkey)。完成,代碼如下: 

public void SetHotKey(Keys c, bool bCtrl, bool bShift, bool bAlt, bool bWindows)
{
m_hotkey = c;
m_ctrlhotkey = bCtrl;
m_shifthotkey = bShift;
m_althotkey = bAlt;
m_winhotkey = bWindows;

// update hotkey
NativeWIN32.KeyModifiers modifiers = NativeWIN32.KeyModifiers.None;
if (m_ctrlhotkey)
modifiers |= NativeWIN32.KeyModifiers.Control;
if (m_shifthotkey)
modifiers |= NativeWIN32.KeyModifiers.Shift;
if (m_althotkey)
modifiers |= NativeWIN32.KeyModifiers.Alt;
if (m_winhotkey)
modifiers |= NativeWIN32.KeyModifiers.Windows;

NativeWIN32.RegisterHotKey(Handle, 100, modifiers, m_hotkey); //Keys.J);
}
一般的,注冊熱鍵要一下幾步

/* ------- using HOTKEYs in a C# application -------

-- code snippet by James J Thompson --

在Form的load 中 : Ctrl+Shift+J

bool success = RegisterHotKey(Handle,
100,
KeyModifiers.Control | KeyModifiers.Shift,
Keys.J);

在 form的closing中:

UnregisterHotKey(Handle, 100);

如何處理熱鍵 : 

protected override void WndProc( ref Message m )
{
const int WM_HOTKEY = 0x0312;

switch(m.Msg)
{
case WM_HOTKEY:

MessageBox.Show("Hotkey pressed");

ProcessHotkey();

break;
}
base.WndProc(ref m );
}


public class NativeWIN32
{
[DllImport("user32.dll", SetLastError=true)]
public static extern bool RegisterHotKey( IntPtr hWnd, // handle to window
int id, // hot key identifier
KeyModifiers fsModifiers, // key-modifier options
Keys vk // virtual-key code
);

[DllImport("user32.dll", SetLastError=true)]
public static extern bool UnregisterHotKey( IntPtr hWnd, // handle to window
int id // hot key identifier
);

[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8
}

}
------- using HOTKEYs in a C# application ------- */

當(dāng)我們按下熱鍵以后,流程是這樣:首先用HWND GetForegroundWindow()來得到窗體,然后要抓出窗體的標(biāo)題, GetWindowText(HWND hwnd, /*out*/LPTSTR lpString, int nMaxCount). 具體如下: 

protected void ProcessHotkey()
{
IntPtr hwnd = NativeWIN32.GetForegroundWindow();
if (!hwnd.Equals(IntPtr.Zero))
{
NativeWIN32.STRINGBUFFER sWindowTitle;
NativeWIN32.GetWindowText(hwnd, out sWindowTitle, 256);

if (sWindowTitle.szText.Length>0)
AddWindowTitle( sWindowTitle.szText ); // add to the ListView (Form)
}
}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
97在线超碰| 久久99国产视频| 国产黄色在线| 国产精品久久久久一区二区国产 | 国产激情网址| 国产黄色在线网站| 国产第一页在线视频| 亚洲日本伊人| 国产精品一卡二卡三卡| 国产裸舞福利在线视频合集| 国产wwww| 国产麻豆高清视频在线第一页| 国产寡妇树林野战在线播放| 亚洲欧美日韩成人网| 久热免费在线视频| 国产免费电影网站入口| 国产区视频在线播放| 影音先锋在线中文字幕| 国产原创av在线| av一级在线| 国产三级视频在线播放线观看| 在线午夜视频| 国产三级在线看| 福利视频网站导航| 国产95在线|亚洲| 国产精选在线观看| 免费三级毛片| 天天草天天爽| 在线免费看黄av| 精品国产福利一区二区在线| 成年人在线观看| 亚洲精品视频区| 国产国产国产国产国产国产| 国产免费a∨片在线观看不卡| 在线观看视频污| 2021天堂中文幕一二区在线观| 高潮白浆视频| 久蕉依人在线视频| 久久久久久久久久久久网站| 99久热re在线精彩视频| 国产变态拳头交视频一区二区 | 99久久国产视频| 国产三级在线免费观看| 懂色av中文在线| 免费日本黄色| 国产在线观看a| 日本中文字幕在线视频| 国产女王在线**视频| 国产精品自产拍在线网站| 免费国产阿v视频在线观看| wwww在线观看| 欧美国产中文| 免费男女羞羞的视频网站中文字幕| 在线免费日韩| www中文字幕在线观看| 欧美视频免费一区二区三区| 免费观看久久久久| 国产免费黄网站| 国产一区二区三区不卡在线| 国产福利电影在线观看| 羞羞视频在线观看免费| 老师我好爽再深一点的视频| 中文字幕在线免费| 国产9色视频| 久热中文字幕精品视频在线| 国产精品外围在线观看| 99久久免费精品国产免费| 亚洲电影视频在线| 国产麻豆精品视频一区二区| 国产精品欧美韩国日本久久| 羞羞视频在线免费看| 最好看更新中文字幕| 亚洲永久免费网站| 天堂在线免费av| 亚洲欧美国产另类首页| 狠狠综合久久久综合| 国产叼嘿网站免费观看不用充会员| 精品美女视频在线观看免费软件| 四虎精品视频| 2021av在线| **三级三级97片毛片| 亚洲精品白浆| 国产视频青青| 精品中文字幕不卡在线视频| 在线观看av网站| 国产精品欧美韩国日本久久| 免费影视观看网站入口| 精精国产xxxx视频在线中文版 | 国产视频精选在线| 日本a级黄色| 精品女厕厕露p撒尿| 国产一区久久精品| 成人超碰在线| 日本一本久久| 亚洲xxxxxx| 亚洲精品自拍区在线观看| 国产视频一二| 国产精品久久久精品a级小说| 毛片在线视频| 国产有码在线| 国产永久免费高清在线观看| 久色视频在线观看| 免费不卡中文字幕视频| 免费一区二区三区视频狠狠| 欧洲有码在线视频| 久草在线资源福利| 九九在线观看免费视频| 国产真实伦在线观看| 四虎成人免费| 亚洲精品白浆| 免费特级黄毛片| 九色精品视频在线观看| 国产久草在线| 国产精品人人爱一区二区白浆| 中文字幕免费中文| 精品乱码一区二区三四区视频| 国产区卡一卡二卡三乱码免费| 国产一起色一起爱| 国产欧美在线观看视频| 国产欧美日韩专区| 一级二级三级在线观看| 久久五月精品| 2021av天天| 热99在线观看| 国产探花视频在线观看| h网址在线观看| 中文字幕在线观看播放| 影音先锋日韩| 国产午夜电影| 免费a级毛片在线播放| 国产无遮挡又黄又爽免费软件 | 永久免费网站在线| 国产毛片视频| 亚洲精品白浆| 国产精品伦一区二区三区级视频频| 在线中文字幕视频观看| 欧美黑人乱大交| 国产极品美女到高潮| 女人色在线免费视频| 国产精品国精产品一二| 蜜桃av网站| 在线成人综合色一区| 天天操天天是| 麻豆福利在线观看| 亚洲欧美日韩成人网| 国产日产一区二区| 久精品在线观看| 青青草原av在线| 在线观看免费高清完整| 国产黄a三级三级三级av在线看| 国产在线视精品麻豆| 伊人资源视频在线| 国产精品入口麻豆免费看| 久久er视频| 黄网在线免费| 九九热在线观看视频| 亚洲私人影吧| 亚洲最新永久观看在线| 国产成免费视频| 国产激情在线观看| 国产www.大片在线| 2018中文字幕在线| 国产黄在线看| 91福利在线视频| 精品入口麻豆传煤| 亚洲尤物在线视频| av在线不卡播放| 尤物在线视频观看| 一级黄色av| 免费黄色网页在线观看| 久热国产在线视频| 中文字幕在线免费视频| 国产三级香港三韩国三级| 国产成人精品久久一区二区小说 | 精品国产一区二区三区四区阿崩 | 青青草中文字幕| 九九在线免费视频| 国产卡一卡二卡三| 国产青青视频| 99精品老司机免费视频| 日本国产在线| 国产精品自产拍在线网站| 国产网站观看9久| 97国产视频| 久精品在线观看| 国产日产一区二区| 天天干天天摸| 1区2区3区在线| 四虎国产精品永久在线| 国产美女av| 精品国产高清a毛片无毒不卡| 日本电影全部在线观看网站视频| 国产在线超碰| 在线中文资源天堂| 国产综合视频一区二区三区免费| 国产午夜视频| 国产在线视精品麻豆| 精品美女在线观看视频在线观看| 久热av在线| eeuss影院在线观看第一页|