如何实现窗体一直被激活?也就是当用户鼠标或键盘组合键(Alt+Tab转到其他应用程序或Alt+F4关闭此窗体)想调到别的窗体或应用程序时,该窗体能直接回到原状态,使窗体一直保持激活装态。
其中有2个问题:
1、如何用鼠标使窗体Deactivate时,窗体能及时回到Activate状态?
2、如何屏蔽键盘的各种组合操作?
为什么如下代码不能所实现第一个问题?
private void form1_Deactivate(object sender,EventArg e)
{
this.Activate();
this.Focus();
}
如下代码根据愚公大大的代码来的,但是当此窗体关闭时会在ThreadFun里出现“目标线程不存在”的错误。
private void InvokeForm()
        {
            this.Activate();
            this.Focus();
        }        private void ThreadFun()
        {
            this.Invoke(new MethodInvoker(this.InvokeForm));
        }        private void LoginForm_Deactivate(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(this.ThreadFun));
            thread.Start();
        }
应该如何改正?
请各位大大不吝指教,提出有建设性意见的都有分!!!

解决方案 »

  1.   

    在窗体失去焦点时,得到焦点
    BlockInput()这个API可以屏蔽大部分的IO
      

  2.   

    to lizhizhe2000(彬彬) :
    BlockInput()这个函数是能实现屏蔽键盘和鼠标的操作,但是结果是让人什么也动不了。
    呵呵,我只能ctrl+alt+delete才能结束程序。不过还是感谢你提出建议。
      

  3.   

    可以设个timer,interval=100
    检测当前获得焦点的窗体标题是否是本程序
    '获得当前窗体句柄
    Public Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
    '获得标题
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    '闪窗体
    Public Declare Function FlashWindow Lib "user32" Alias "FlashWindow" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
    '激活窗体
    Public Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (ByVal hwnd As Long) As Long如果想当本窗全不是激活状态的话,限制用户使用某种键组合或者鼠标的一些操作比较复杂
    但主要是使用api函数hook来进行监视,使用sendmessage、postmessage等函数来阻止系统的某些消息,很复杂咯如果是处于激活状态,键盘事件,使用窗体的keydown事件就行(窗体的keypreview属性要为true)就可以监视并阻止了,鼠标还得用hook函数
      

  4.   

    test ok on .net2public class T:Form
    {
    public T()
    {
    }

    protected override void OnDeactivate(EventArgs e)
    {
    Thread t=new Thread(new ThreadStart(SetFocus));
    t.Start();
    }

    public void SetFocus()
    {
    this.Activate();
    }


    public static void Main()
    {
    Application.Run(new T());
    }}
      

  5.   

    还是用钩子函数吧,到www.codeproject.com上去找一下,有很好的源代码。
      

  6.   

    to shuiwatermizu() :
    以上代码你确信做了测试了吗?
    除了不能实现我所要的功能外,还有一个错误,当窗体发生取消激活事件时出现“线程间操作无效: 从不是创建控件“LoginForm”的线程访问它。”错误。
      

  7.   

    做过测试,你可以直接把源码拷贝编译执行一下。我觉得当你应用到你的项目中的时候出了错,因为我没有用到LoginForm, 把你的代码贴出来看看。
      

  8.   

    ctrl alt del 很强力 ...
      

  9.   

    全局hook  把键盘事件屏蔽掉