b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

【编程问答】通过快捷键取消透明+透过无效麻烦

电脑杂谈  发布时间:2021-02-13 14:01:18  来源:网络整理

我想使用C#制作一个可以透明+滑过鼠标的窗口,但是我遇到了一些问题。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;

namespace Easy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        static int hHook = 0;
        public const int WH_KEYBOARD_LL = 13;
        HookProc KeyBoardHookProcedure;


        private void Form1_Load(object sender, EventArgs e)
        {
            this.Opacity = 0.8;
            this.TopMost = true;
            this.ShowInTaskbar = true;
            this.WindowState = FormWindowState.Normal;
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
            SetLayeredWindowAttributes(Handle, 0, 128, LWA_ALPHA);
        }




        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        #region DllImport
        //设置钩子   
        [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        //抽掉钩子   
        public static extern bool UnhookWindowsHookEx(int idHook);
        [DllImport("user32.dll")]
        //调用下一个钩子   
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);
        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        public static extern long GetWindowLong(IntPtr hwnd, int nIndex);
        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
        [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
        public static extern int SetLayeredWindowAttributes(IntPtr Handle, int crKey, byte bAlpha, int dwFlags);
        const int GWL_EXSTYLE = -20;
        const int WS_EX_TRANSPARENT = 0x20;
        const int WS_EX_LAYERED = 0x80000;
        const int LWA_ALPHA = 2;

        #endregion
        #region 自定义事件
        public void Hook_Start()
        {
            // 安装键盘钩子   
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                KeyBoardHookProcedure,
                GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 
                if (hHook == 0)
                {
                    Hook_Clear();
                    //throw new Exception("设置Hook失败!");  
                }
            }
        }

        //取消钩子事件   
        public void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
            //如果去掉钩子失败.   
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
        }
       
        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                if (kbh.vkCode == (int)Keys.Y && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
                { MessageBox.Show("x");
                SetWindowLong(lParam, GWL_EXSTYLE, GetWindowLong(lParam, GWL_EXSTYLE));
                }
            }
            
            return CallNextHookEx(hHook, nCode, wParam, lParam);  
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Hook_Start();
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_TRANSPARENT | WS_EX_LAYERED);

        }

        private void button2_Click(object sender, EventArgs e)
        {
 
            Hook_Clear();  
        }

    }
}
        #endregion

此程序有两个问题

1。用快捷键调用全局挂钩后,该消息框将弹出两次,第一个消息框将迅速弹出,第二个消息框将需要等待大约3s

2,使用快捷键取消透明度+透明失效

谢谢,请帮助我进行分析。

--------------------编程问题与解答--------------------

c# 钩子获取鼠标左右键_c# 鼠标点击钩子_c#鼠标钩子源码

不理解,帮顶--------编写问题解答------------------- ---------------------编程问题与解答--------------------有这样的麻烦吗?将表单this.TransparencyKey设置为Transparent

很容易将控件放入其中,例如RICHTECTBOX,WEBBRER等。通过窗口根本没有问题。 --------------------编写问题与解答--------------------引用denqh的回覆3日楼:是的,麻烦吗?将表单this.TransparencyKey设置为Transparent


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-356735-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...