VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1958|回复: 16

如何实现窗体一直被激活?及如何屏蔽键盘组合键操作?请大大有空过来看看!

[复制链接]

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-6 17:10:01 | 显示全部楼层 |阅读模式
如何实现窗体一直被激活?也就是当用户鼠标或键盘组合键(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();
        }
应该如何改正?
请各位大大不吝指教!!!
回复

使用道具 举报

0

主题

11

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-6 20:24:01 | 显示全部楼层
友情幫頂
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-6 20:33:01 | 显示全部楼层
顶!!!
LZ
SF
回复

使用道具 举报

0

主题

119

帖子

67.00

积分

新手上路

Rank: 1

积分
67.00
发表于 2020-1-7 00:27:01 | 显示全部楼层
在窗体失去焦点时,得到焦点
BlockInput()这个API可以屏蔽大部分的IO
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-1-9 12:18:01 | 显示全部楼层
to 苹果小刀 :
BlockInput()这个函数是能实现屏蔽键盘和鼠标的操作,但是结果是让人什么也动不了。
呵呵,我只能ctrl+alt+delete才能结束程序。不过还是感谢你提出建议。
回复

使用道具 举报

0

主题

23

帖子

20.00

积分

新手上路

Rank: 1

积分
20.00
发表于 2020-1-10 16:45:01 | 显示全部楼层
Winproc 截取系统消息
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-18 16:27:02 | 显示全部楼层
可以设个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函数
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-8 09:15:01 | 显示全部楼层
test ok on .net2

public 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());
        }

}
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-6-20 15:00:01 | 显示全部楼层
to ledmirage1 :
以上代码你确信做了测试了吗?
除了不能实现我所要的功能外,还有一个错误,当窗体发生取消激活事件时出现“线程间操作无效: 从不是创建控件“LoginForm”的线程访问它。”错误。
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-4 07:45:02 | 显示全部楼层
做过测试,你可以直接把源码拷贝编译执行一下。

我觉得当你应用到你的项目中的时候出了错,因为我没有用到LoginForm, 把你的代码贴出来看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表