怎么在C#中,当打开winform窗口时,其他的应用都不能打开,只能在winform上操作,就像模式窗口差不多
详细说明问题:就是在winform中,当我打开winform窗口,他可以阻断其他应用,只能在这个窗口上操作,其他操作都失灵了...
详细说明问题:就是在winform中,当我打开winform窗口,他可以阻断其他应用,只能在这个窗口上操作,其他操作都失灵了
展开
8个回答
展开全部
SetWindowsHookEx调用这个API,设置一个全局钩子,把其他窗体的鼠标和键盘消息全部拦截下来
我做了一个例子,屏蔽其他窗体的鼠标左键,也就是说只有你的窗体可以获得鼠标消息。你可以参考一下,希望对你有帮助,下面是代码,窗体启动的时候设置hook,点击Button的时候,取消hook
[DllImport("user32.dll")]public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll")]
public static extern int UnhookWindowsHookEx(IntPtr idHook);
private IntPtr nMouseHook = IntPtr.Zero;
private const int WH_MOUSE_LL = 14;
private const int WM_LBUTTONDOWN = 0x0201;
private Rectangle rect;
private IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return CallNextHookEx(nMouseHook, nCode, wParam, lParam);
}
MSLLHOOKSTRUCT msg = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
if ((int)wParam == WM_LBUTTONDOWN)
{
rect.X = this.Location.X;
rect.X = this.Location.X;
rect.Width = this.Width;
rect.Height = this.Height;
if (!rect.Contains(msg.pt))
{
return (IntPtr)1;
}
}
return CallNextHookEx(nMouseHook, nCode, wParam, lParam);
}
void Form2_Load(object sender, EventArgs e)
{
IntPtr nHinstance = Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]);
nMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, nHinstance, 0);
rect = new Rectangle(this.Location.X, this.Location.Y, this.Width, this.Height);
}
private void button1_Click(object sender, EventArgs e)
{
UnhookWindowsHookEx(nMouseHook);
}
struct MSLLHOOKSTRUCT
{
public Point pt;
public UInt16 mouseData;
public UInt16 flags;
public UInt16 time;
public IntPtr dwExtraInfo;
}
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
我做了一个例子,屏蔽其他窗体的鼠标左键,也就是说只有你的窗体可以获得鼠标消息。你可以参考一下,希望对你有帮助,下面是代码,窗体启动的时候设置hook,点击Button的时候,取消hook
[DllImport("user32.dll")]public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll")]
public static extern int UnhookWindowsHookEx(IntPtr idHook);
private IntPtr nMouseHook = IntPtr.Zero;
private const int WH_MOUSE_LL = 14;
private const int WM_LBUTTONDOWN = 0x0201;
private Rectangle rect;
private IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return CallNextHookEx(nMouseHook, nCode, wParam, lParam);
}
MSLLHOOKSTRUCT msg = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
if ((int)wParam == WM_LBUTTONDOWN)
{
rect.X = this.Location.X;
rect.X = this.Location.X;
rect.Width = this.Width;
rect.Height = this.Height;
if (!rect.Contains(msg.pt))
{
return (IntPtr)1;
}
}
return CallNextHookEx(nMouseHook, nCode, wParam, lParam);
}
void Form2_Load(object sender, EventArgs e)
{
IntPtr nHinstance = Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]);
nMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, nHinstance, 0);
rect = new Rectangle(this.Location.X, this.Location.Y, this.Width, this.Height);
}
private void button1_Click(object sender, EventArgs e)
{
UnhookWindowsHookEx(nMouseHook);
}
struct MSLLHOOKSTRUCT
{
public Point pt;
public UInt16 mouseData;
public UInt16 flags;
public UInt16 time;
public IntPtr dwExtraInfo;
}
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
展开全部
你无法阻断其他应用,最多把它们都放到后台,除非你关闭计算机
你可以这样尝试
From o = new From ();
o.FormBorderStyle = FormBorderStyle.None;
o.WindowState = FormWindowState.Maximized;
o.TopMost = true;
o.ShowDialog();
你可以这样尝试
From o = new From ();
o.FormBorderStyle = FormBorderStyle.None;
o.WindowState = FormWindowState.Maximized;
o.TopMost = true;
o.ShowDialog();
追问
我刚试了一下您的方法,呵呵,有点太极端了,我打开程序以后,电脑就是winform的窗口,关闭都不方便,我想要的是在窗口正常的情况下(不是最大化的时候)能达到那种效果,我再上网查一下,不行的话只有用你这种方法了
追答
你可以为窗体加一个Esc按钮退出的功能,或者加上退出按钮不就可以了么~
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
供参考:
private void onbtnClick(object sender,EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
private void onbtnClick(object sender,EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
更多追问追答
追问
你这个程序showDialog只是阻断form1的应用,我想的是所有应用都阻断,比如点击桌面图标也不可以的,请问有什么想法也可以,我可以去网上查
追答
这个要调用windows系统自带的API来完成
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你说的其它应用是指什么?word之类的?如果 是这类的话应该是没法阻断的,如果是在程序里面打开其它应用的话,不实用模式窗体也是没法阻断的
追问
其他应用包括桌面上安装的应用,比如”我的电脑“这些东西也包括,知识运行这个Winform主窗口
追答
我觉得你可以让程序全屏显示,然后把最小化、最大化都屏蔽掉,只留下关闭按钮,然后再把桌面的任务栏锁定,不让它操作或者直接把任务栏隐藏掉,这样应该就可以实现了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
貌似不可能吧。
你如果能简单做到这点,你就可以关掉防火墙,杀毒软件和任何的授权系统,然后为所欲为,成了超级病毒了。
你如果能简单做到这点,你就可以关掉防火墙,杀毒软件和任何的授权系统,然后为所欲为,成了超级病毒了。
更多追问追答
追问
呵呵,没有那么厉害,想要的效果就是跟鼠标失效差不多,就是鼠标只能在这个winform窗口上起效果,在其他地方都不起效果的功能,比如点击”我的电脑“图标,不起作用,winform窗口会像ShowDialog过的窗口一样,抖一下,希望还有什么办法,经理分的活,就是让这么干,我也木办法
追答
光是鼠标好办,可以让鼠标离不开你的窗口。但如果用户直接按ctrl-alt-delete 我不知道你怎么能劫持。
publicpartialclassForm1:Form{publicForm1(){InitializeComponent();
pictureBox1.MouseCaptureChanged+=newEventHandler(pictureBox1_MouseCaptureChanged);
pictureBox1.MouseDown+=newMouseEventHandler(pictureBox1_MouseDown);
button1.Click+=newEventHandler(button1_Click);}privatevoid button1_Click(object sender,EventArgs e){var rc = pictureBox1.RectangleToScreen(newRectangle(Point.Empty, pictureBox1.ClientSize));Cursor.Position=newPoint(rc.Left+ rc.Width/2, rc.Top+ rc.Height/2);Cursor.Clip= rc;
pictureBox1.Capture=true;
pictureBox1.Cursor=Cursors.Cross;}void pictureBox1_MouseDown(object sender,MouseEventArgs e){
pictureBox1.Capture=false;}void pictureBox1_MouseCaptureChanged(object sender,EventArgs e){if(!pictureBox1.Capture){
pictureBox1.Cursor=Cursors.Default;Cursor.Clip=newRectangle(0,0,0,0);}}protectedoverride bool ProcessCmdKey(refMessage msg,Keys keyData){if(keyData ==Keys.Escape) pictureBox1.Capture=false;returnbase.ProcessCmdKey(ref msg, keyData);}}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把窗体的Show() 方法改成 ShowDialog()方法
追问
我想阻断的是所有应用,比如桌面图标也可以,你给这个貌似只能阻断父窗口,不过还是谢谢,有其他想法没了
追答
你把窗体属性 设成最大化 置顶
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接执行窗口的SHowDialog事件、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询