bool temp;
form_click中
temp=true;

解决方案 »

  1.   

    能说明白点吗?
    可是在当鼠标在窗体外Click的时候并不能执行form_click事件
    而且在Form的控件中执行Click的时候也并不能执行form_click事件
      

  2.   

    在外就不会触发form_click了,temp就不会变true;在form上click,那就触发form_click了,temp=true了
      

  3.   

    control.mousebutton.x来判断如何?
      

  4.   

    很简单,如果鼠标Click时是在窗体外,那么,你的窗体或控件不能接收到这个单击消息。换句话说,也就是 不能引发你的窗体或控件的单击事件。
      

  5.   

    就是啊,很简单的,先判断是不是click事件,在判断是不是创体内的!
      

  6.   

    csdn上没有多少高手,看来我自己解决好了我使用了一个timer,然后定时取得鼠标的位置和鼠标键的状态,判断是否是窗体之外。
    不过这样有可能会漏掉某些事件
      

  7.   

    用hook啊!兄弟
    这方面的帖子很多啊!
      

  8.   

    呵呵,这个问题,其实是一个比较有挑战的问题,用hook 大才小用,过于浪费资源,
    用timer 更是不行,因为鼠标点击的过程非常短,你的timer无论多们短,有时候总是会漏过一个消息的.给你个提示,假设点击form 上的其他控件,form 当然不产生click事件,但是他会收到一个别的消息,用SPY++看看就知道了,然后override WndProc 就ok了,问题,本人遇到,而且已经解决.如果需要,我可以,告诉你很多方法,但是好的就一个,对我而言:)
      

  9.   

    你应该是说就算是在窗体上的控件上点击也要关闭吧。
    那不是可以在每个控件的Click事件中写下你要的代码吗?
      

  10.   

    to winter_leaf_wei(一个人) 
    能给些代码提示吗?
      

  11.   

    这个土办法不知行不行,,给你每个form一个编号,,设定一个全局变量,,初始值赋为null,,然后看哪个窗体点到了,,就把该窗体的编号赋给那个变量,,把相关的窗体设计为开始就开始在检测这个变量,,如果该变量的值不是自己的编号且不等于null时关闭。不知这样可不可行。
      

  12.   

    to winter_leaf_wei(一个人)谢谢,如果方便的话给我发Email也可以[email protected]
      

  13.   

    to rinami() 无法触发窗体的失去焦点事件
      

  14.   

    to rinami() 窗体的失去焦点事件无法执行,我试过了
      

  15.   

    有谁能介绍一下Hook?我对Hook还不是很熟悉
    谢过了
      

  16.   

    C#和.Net Framework中没有直接提供消息钩子的方法,但是可以通过API函数和非托管内存访问机制来实现。你可以参考以下的步骤:1、声明一个钩子函数代理:
    public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);2、声明API函数:
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);

    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern bool UnhookWindowsHookEx(IntPtr hhook);

    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
    public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);[DllImport("kernel32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
    public static extern int GetCurrentThreadId();public const int WH_MSGFILTER = -1;
    3、写你自己的HookProc代理实现方法,如MyHookProc
    public IntPtr MyHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
    //...你的代码
    return CallNextHookEx(iHookHandle, code, wparam, lparam);
    }4、为你的类声明一个Hook Handle和非托管的钩子线程地址:
    private IntPtr _iHookHandle=IntPtr.Zero;
    private GCHandle _hookProcHandle;5、在合适的地方安装你的钩子
    HookProc hookProc = new HookProc(MyHookProc);
    _hookProcHandle = GCHandle.Alloc(hookProc);
    iHookHandle = SetWindowsHookEx(WH_MSGFILTER, hookProc, IntPtr.Zero, .GetCurrentThreadId());
    if (iHookHandle == IntPtr.Zero) throw new System.Exception("没有足够权限安装钩子!");6、在合适的地方卸载你的钩子
    if (iHookHandle!=IntPtr.Zero)
    UnhookWindowsHookEx(iHookHandle);
    _hookProcHandle.Free();
    iHookHandle = IntPtr.Zero;