??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲综合在线观看视频,亚洲av无码久久忘忧草,亚洲国产成人AV网站http://www.tkk7.com/longturi/category/53892.html本博不原创,转帖自己感兴那些事人物Q什么入D(chung)什?随心所ƌӀ?/description>zh-cnSun, 27 Apr 2014 22:24:49 GMTSun, 27 Apr 2014 22:24:49 GMT60java swing 囄按钮的?/title><link>http://www.tkk7.com/longturi/archive/2014/04/27/412973.html</link><dc:creator>ZT文萃</dc:creator><author>ZT文萃</author><pubDate>Sun, 27 Apr 2014 03:12:00 GMT</pubDate><guid>http://www.tkk7.com/longturi/archive/2014/04/27/412973.html</guid><wfw:comment>http://www.tkk7.com/longturi/comments/412973.html</wfw:comment><comments>http://www.tkk7.com/longturi/archive/2014/04/27/412973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/longturi/comments/commentRss/412973.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/longturi/services/trackbacks/412973.html</trackback:ping><description><![CDATA[转蝲自:(x)<div><a >http://chenyu-hz.iteye.com/blog/1432978</a></div><br /><div><div class="j1vlrtb" id="blog_content"> <p><strong>1 JButton </strong><strong>囄和文字按钮的实现</strong> </p> <table border="0" cellpadding="0" cellspacing="0"> <tbody><tr> <td width="1"> <br /></td> </tr> <tr> <td> <br /></td> <td> <p>JButton btn1 = <strong>new</strong> JButton("打开", <strong>new</strong> ImageIcon(ImageView.<strong>class</strong>.getResource("10.png"))) ;</p> <p>btn1.setHorizontalTextPosition(SwingConstants.<em>CENTER</em>);</p> <p>btn1.setVerticalTextPosition(SwingConstants.<em>BOTTOM</em>);</p> </td> </tr> </tbody></table> <p> </p> <p>效果?Q?/p> <p><a target="_blank" ><img alt="clip_image003" src="http://blog.chinaunix.net/attachment/201202/29/22375044_1330531191H3Nh.jpg" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image003" border="0" height="75" width="405" /></a></p> <p><strong></strong></p> <p><strong>2 JButton </strong><strong>囄透明按钮的实?/strong> </p> <table border="0" cellpadding="0" cellspacing="0"> <tbody><tr> <td width="1"> <br /></td> </tr> <tr> <td> <br /></td> <td> <p>setLayout(<strong>new</strong> FlowLayout(FlowLayout.<em>RIGHT</em>, 30, 0));</p> <p>btn1.setIcon(UIConfig.<em>getImgUrl</em>("常用交易?png"));</p> <p>btn1.setRolloverIcon(UIConfig.<em>getImgUrl</em>("常用交易.png"));</p> <p>btn1.setBorderPainted(<strong>false</strong>);</p> <p>btn1.setFocusPainted(<strong>false</strong>);</p> <p>btn1.setContentAreaFilled(<strong>false</strong>);</p> <p>btn1.setFocusable(<strong>true</strong>);</p> <p>btn1.setMargin(<strong>new</strong> Insets(0, 0, 0, 0));</p> <p>btn1.setText("常用交易");</p> </td> </tr> </tbody></table> <p> </p> <p><a target="_blank" ><img alt="clip_image006" src="http://blog.chinaunix.net/attachment/201202/29/22375044_13305311920R9a.jpg" style="border-width: 0px; margin: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006" border="0" height="41" width="216" /></a></p> <p><strong>3JRadioButton </strong><strong>囄透明按钮的实?/strong></p> <p>JRadioButton radio = <strong>new</strong> JRadioButton(UIConfig.<em>getImgUrl</em>("常用交易?png") );</p> <p>radio.setContentAreaFilled(<strong>false</strong>);</p> <p>radio.setRolloverIcon(UIConfig.<em>getImgUrl</em>("常用交易.png"));</p> <p>radio.setSelectedIcon(UIConfig.<em>getImgUrl</em>("常用交易.png"));</p> <p><a target="_blank" ><img alt="clip_image006[1]" src="http://blog.chinaunix.net/attachment/201202/29/22375044_1330531193EH0X.jpg" style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006[1]" border="0" height="41" width="216" /></a></p> </div></div><img src ="http://www.tkk7.com/longturi/aggbug/412973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/longturi/" target="_blank">ZT文萃</a> 2014-04-27 11:12 <a href="http://www.tkk7.com/longturi/archive/2014/04/27/412973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更改swing应用E序标题栏默认图?/title><link>http://www.tkk7.com/longturi/archive/2014/02/21/410135.html</link><dc:creator>ZT文萃</dc:creator><author>ZT文萃</author><pubDate>Fri, 21 Feb 2014 02:13:00 GMT</pubDate><guid>http://www.tkk7.com/longturi/archive/2014/02/21/410135.html</guid><wfw:comment>http://www.tkk7.com/longturi/comments/410135.html</wfw:comment><comments>http://www.tkk7.com/longturi/archive/2014/02/21/410135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/longturi/comments/commentRss/410135.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/longturi/services/trackbacks/410135.html</trackback:ping><description><![CDATA[转蝲自:(x)<div>http://www.cnblogs.com/happyPawpaw/archive/2013/03/27/2984023.html</div><br /><div><p>现提供两U方法:(x) <br />Ҏ(gu)一Q?nbsp;<br />如果你用qToolkit(java.awt.Toolkit)c,q将是一件很单的事情Q?nbsp;<br />Toolkit tk=Toolkit.getDefaultToolkit() <br />Image image=tk.createImage("image.gif"); /*image.gif是你的图?/ <br />this.setIconImage(image); </p> <p>注意Q这个图标一定要是好用的图标?br /><br />p么简单,看看Q已l变成你自己的图标了。Toolkit是个很有用类的,提供很多对窗口默认行为的修改Q下面随便提一下,怎么把默认的鼠标图标Ҏ(gu)你自q图标Q?nbsp;<br />Toolkit tk=Toolkit.getDefaultToolkit(); <br />Image img=tk.getImage("mouse.gif"); /*mouse.gif是你的图?/ <br />Cursor cu=tk.createCustomCursor(img,new Point(10,10),"stick"); <br />this.setCursor(cu); <br /><br />Ҏ(gu)二:(x) <br />用到ImageIconcdsetIconImageҎ(gu)?nbsp;<br />import javax.swing.*; <br />public class A extends JFrame { <br />    String image = new String("face.gif"); //建立一个字W串保存要用的图标的路径Q关于java的\径请参考其它文?nbsp;<br />    ImageIcon test = new ImageIcon(image); //建立一个ImageIconc,产生setIconImage()Ҏ(gu)需要的Image数据 <br /><br />    public A() { <br />        super("演示自定义标题栏的图标的Ҏ(gu)"); <br />        this.setIconImage(test.getImage()); //讄标题栏的图标为face.gif <br />        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        <br />        this.show(); <br />        //this.setTitle("sdfsdf"); <br />        this.setSize(400,200); <br />    } <br />    public static void main(String[] args) { <br />        A jIcon = new A();       <br />    } <br />} <br /><br />此法本h再次化ؓ(f)两条语句Q?nbsp;<br />import javax.swing.*; <br />public class A extends JFrame { <br />    ImageIcon test = new ImageIcon(new String(face.gif));//W一?nbsp;<br />    public A() { <br />        super("演示自定义标题栏的图标的Ҏ(gu)"); <br />        this.setIconImage(test.getImage()); //W二?nbsp;<br />         this.setSize(400,200); <br />        this.show(); <br />} <br />    public static void main(String[] args) { <br />        A jIcon = new A();       <br />    } <br />}</p></div><img src ="http://www.tkk7.com/longturi/aggbug/410135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/longturi/" target="_blank">ZT文萃</a> 2014-02-21 10:13 <a href="http://www.tkk7.com/longturi/archive/2014/02/21/410135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的LookAndFeelhttp://www.tkk7.com/longturi/archive/2014/02/12/409753.htmlZT文萃ZT文萃Wed, 12 Feb 2014 02:20:00 GMThttp://www.tkk7.com/longturi/archive/2014/02/12/409753.htmlhttp://www.tkk7.com/longturi/comments/409753.htmlhttp://www.tkk7.com/longturi/archive/2014/02/12/409753.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/409753.htmlhttp://www.tkk7.com/longturi/services/trackbacks/409753.html

下文转蝲自:(x)

http://www.cnblogs.com/qixin622/archive/2010/07/23/1784002.html

 


Java'中的几种Look and Feel
1、Metal风格 (默认)
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
2、Windows风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
3、Windows Classic风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
4、Motif风格
String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
5、Mac风格 (需要在相关的操作系l上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
6、GTK风格 (需要在相关的操作系l上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
7、可跨^台的默认风格
String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);
8、当前系l的风格
String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);

在Java中让用户能够动态地更改应用的外观,可以l用h好地体验Q具体的实现方式是:(x)
1Q先使用UIManager.setLookAndFeel(String s)Ҏ(gu)讑֮对应的外?
2Q再使用SwingUtilities.updateComponentTreeUI(Component c)Ҏ(gu)立刻更新应用的外?br />q两个类均在javax.swing包中



ZT文萃 2014-02-12 10:20 发表评论
]]>
C#键盘钩子http://www.tkk7.com/longturi/archive/2013/11/14/406321.htmlZT文萃ZT文萃Wed, 13 Nov 2013 23:56:00 GMThttp://www.tkk7.com/longturi/archive/2013/11/14/406321.htmlhttp://www.tkk7.com/longturi/comments/406321.htmlhttp://www.tkk7.com/longturi/archive/2013/11/14/406321.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/406321.htmlhttp://www.tkk7.com/longturi/services/trackbacks/406321.html    本文由xyz8808贡献
    2009-11-26 12:49//定义变量
    public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
    static int hKeyboardHook = 0;
    HookProc KeyboardHookProcedure;
    /*************************
    * 声明API函数
    * ***********************/
    // 安装钩子 Qusing System.Runtime.InteropServices;Q?
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId);
    // 卸蝲钩子
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);
    // l箋下一个钩?
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
    // 取得当前U程~号Q线E钩子需要用刎ͼ
    [DllImport("kernel32.dll")]
    static extern int GetCurrentThreadId();
    //钩子子程Q就是钩子所要做的事?
    private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    /****************
    //U程键盘钩子判断是否按下?
    Keys keyData = (Keys)wParam;
    if(lParam.ToInt32() > 0)
    {
    // 键盘按下
    }
    if(lParam.ToInt32() < 0)
    {
    // 键盘抬v
    }
    ****************/
    /****************
    //全局键盘钩子判断是否按下?
    wParam = = 0x100 // 键盘按下
    wParam = = 0x101 // 键盘抬v
    ****************/
    KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘
    // 在这里添加你惌做是事情(比如把键盘nCode记录下来,搞个邮g发送程序发到自q邮箱?
    return 0;//如果q回1Q则l束消息Q这个消息到此ؓ(f)止,不再传递。如果返?或调用CallNextHookEx函数则消息出了这个钩子l往下传递,也就是传l消息真正的接受?
    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
    }
    //键盘l构
    public struct KeyMSG
    {
    public int vkCode; //键?
    public int scanCode;
    public int flags;
    public int time;
    public int dwExtraInfo;
    }
    // 安装钩子
    public void HookStart()
    {
    if(hKeyboardHook == 0)
    {
    // 创徏HookProc实例
    KeyboardHookProcedure = new HookProc(KeyboardHookProc);
    // 讄U程钩子
    hKeyboardHook = SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
    //************************************
    //键盘U程钩子
    //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()监视的线EID,你完全可以自己写个方法获取QQ的线E哦
    //键盘全局钩子,需要引用空?using System.Reflection;)
    //SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
    //
    //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数钩子加入到钩子链表中,说明一下四个参敎ͼ(x)
    //idHook 钩子cdQ即定钩子监听何种消息Q上面的代码中设?Q即监听键盘消息q且是线E钩子,如果是全局钩子监听键盘消息应设?3Q?
    //U程钩子监听鼠标消息设ؓ(f)7Q全局钩子监听鼠标消息设ؓ(f)14?
    //
    //lpfn 钩子子程的地址指针。如果dwThreadId参数? 或是一个由别的q程创徏的线E的标识Qlpfn必须指向DLL中的钩子子程?除此以外Qlpfn?
    //以指向当前进E的一D钩子子E代码。钩子函数的入口地址Q当钩子钩到M消息后便调用q个函数?
    //
    //hInstance应用E序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前q程创徏的一个线E,而且子程代码位于当前
    //q程QhInstance必须为NULL。可以很单的讑֮其ؓ(f)本应用程序的实例句柄?
    //
    //threadedId 与安装的钩子子程相关联的U程的标识符。如果ؓ(f)0Q钩子子E与所有的U程兌Q即为全局钩子?
    //************************************
    // 如果讄钩子p|
    if(hKeyboardHook == 0 )
    {
    HookStop();
    throw new Exception("SetWindowsHookEx failed.");
    }
    }
    }
    // 卸蝲钩子
    public void HookStop()
    {
    bool retKeyboard = true;
    if(hKeyboardHook != 0)
    {
    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
    hKeyboardHook = 0;
    }
    if (!( retKeyboard))
    throw new Exception("UnhookWindowsHookEx failed.");
    }
    //*****************************
    试用了一下,不是很稳定,改回自带?KeyUp函数了,记录以备?br />    //自定义类?br />    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    //接口调用
    [DllImport( "User32.DLL ")]
    public static extern int SendMessage(IntPtr hWnd, uint Msg,int wParam,int lParam);
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport("User32.Dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport( "user32",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(HookType idHook,HOOKPROC lpfn,int hmod,int dwThreadId);
    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode,int wParam,int lParam);
    //函数实现
    public void SetHook()
    {
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    IntPtr ParenthWnd = new IntPtr(0);
    bool isPressed = (((lParam & 0x80000000) == 0) && (nCode==0));
    CallNextHookEx(m_HookHandle, nCode, wParam, lParam); //先把消息发给pȝ默认处理队列
    global.lastKeyValue = wParam;
    ParenthWnd = FindWindow( null,"零售业务");
    switch(wParam)
    {
    case 112: //修改数量 F1
    if(isPressed)
    {
    inputType = global.ST_NUM_STP1;
    doKeyWork();
    }
    break;
    case 113: //备注 F2
    if(isPressed)
    {
    inputType = global.ST_REMARK;
    textBoxBZ.Focus();
    textBoxBZ.SelectAll();
    }
    break;
    case 114: //摘要 F3
    if(isPressed)
    {
    inputType = global.ST_ABST;
    textBoxZY.Focus();
    textBoxZY.SelectAll();
    }
    break;
    case 115: //支付 F4
    if(isPressed)
    if((global.saleList == null) || (global.saleList.Length == 0))
    break;
    else
    {
    showProductInfo();
    labelCPZS.Text = global.sAllNum.ToString() + " ?;
    labelYSJE.Text = global.sAllValue.ToString() + " ?;
    labelYHJE.Text = global.sPriValue.ToString() + " ?;
    labelSSJE.Text = global.sDueValue.ToString() + " ?;
    inputType = global.ST_GATHER_STP1;
    textBoxSK.Focus();
    textBoxSK.SelectAll();
    }
    break;
    case 116: //输入产品 F5
    if(isPressed)
    {
    inputType = global.ST_PRODUCT;
    textBoxSPMC.Focus();
    textBoxSPMC.SelectAll();
    }
    break;
    case 117: //开始新订单 F6
    if(isPressed)
    {
    resetSale(); //销售界面复?br />    }
    break;
    default:
    //CallNextHookEx(m_HookHandle, nCode, wParam, lParam);
    break;
    }
    return(0);
    }
    ///
    /// 清理所有正在用的资源?br />    ///
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }
    C#中键盘钩子的使用
    默认分类 2008-07-05 17:33 阅读53 评论0 字号Q?大大 中中 小 public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //在这里放|你的处理代?return 0;
    }
    }
    使用Ҏ(gu)
    可以在Form的构造函数里攑օ
    Win32Hook hook = new Win32Hook();
    hook.SetHook();
    C#+低Windows API钩子拦截键盘输入
    www.diybl.com 旉Q?010-01-14 作?匿名 ~辑:Smi1e 点击Q 9 [评论]
    -
    -
    摘要 在家里,婴儿和其它动物可能会(x)重击你的计算机键盘,致出现各种无法预言的结果。本文中的这个C#CZ应用E序向你展C如何基于Windows钩子API来实现在击键造成M危害之前捕获它们?
    一. ?
    猫和婴儿有很多共同之处。他们都喜欢吃家中养植的植物Q都非常讨厌关门。他们也都爱玩弄你的键盘Q结果是Q你正发送给你的老板的电(sh)子邮件可能是以半截句子发送出ȝQ你的Excel帐户也被加入了一些ؕ七八p的内容Qƈ且你q没有注意到Q当打开Windows资源理器时Q若q文件已l被Ud了回收站Q?
    其解x案是Q开发一个应用程序实现如下功能:(x)只要键盘处于"威胁状?你就可以q行切换Qƈ保M键盘输入zd都不?x)造成危害。本文想展示如何使用一U低UWindows API钩子在一个C#应用E序中实现键?控制"。下图是本文CZE序的一个运行快照?
    ? 背景
    其实Q已l存在许多有关于Windows钩子的文章和CZ代码Qƈ且已l有人编写过与本文几乎一L(fng)C++CZE序。然而,当我搜烦相应的C#应用E序的源码时Q却扑ֈ极少?NETCZQ而且没有一个程序能够提供一个方便的自包含的C#cR?
    .NET框架能够使你以托方式来存取你最怋用的键盘事gQ通过KeyPressQKeyUp和KeyDownQ。遗憄是,q些事g都不能被用来停止Windowsl合键(如Alt+Tab或Windows"开?键)Q从而允许用?q离"某一个应用程序?
    本文的想法在操作pȝU上捕获键盘事g而不是通过框架U来实现。ؓ(f)此,应用E序需要用Windows API函数来把它自w添加到应用E序"钩子?中以监听来自操作pȝ的键盘消息。当它收到这U类型的消息Ӟ该应用程序能够选择性地传递消息,或者进行正常处理,或?镇压"它以便不再有其它应用E序Q包括WindowsQ来影响它。本文正是想解释其实现机理?
    然而,h意,本文中的代码仅适用于基于NT版本的WindowsQNTQ?000和XPQ,q且无法使用q个Ҏ(gu)来停用Ctrl+Alt+Delete。有关于如何实现q一点,你可以参考MSDN有关资料?
    ? 使用代码
    Z易于使用Q我在本文中提供了两个独立的zip文g。一个仅包含KeyboardHookc,q是本文介绍的重炏V另一个是一个完整的微YVisual C# 2005 Express Edition应用E序工程Q名?Baby Keyboard Bash"Q它实现昄击键的名字或彩色的Ş状以响应于击键?
    ? 实例化类
    键盘钩子是通过keyboard.cs中的KeyboardHookcL建立和管理的。这个类实现了IDisposable接口Q因此,实例化它的最单的Ҏ(gu)是在应用E序的Main()Ҏ(gu)中用using关键字来装Application.Run()调用。这确保只要该应用E序开始即建立钩子q且Q更重要的是Q当该应用程序结束时立即使这个钩子失效?
    q个cd发一个事件来警告应用E序已经有键被按下,因此主表单能够存取在Main()Ҏ(gu)中创建的KeyboardHook实例显得非帔R要;最单的Ҏ(gu)是把q个实例存储在一个公共成员变量中?
    KeyboardHook提供了三U构造器来启用或用某些讄Q?
    · KeyboardHook()Q捕h有击键,没有M内容传递到Windows或另外的应用E序?
    · KeyboardHook(string param)Q把参数串{换ؓ(f)Parameters枚D中的g一Q然后调用下面的构造器Q?
    · KeyboardHook(KeyboardHook.Parameters enum)Q根据从Parameters枚D中选择的值的不同Q分别启动下列设|:(x)
    o Parameters.AllowAltTabQ允许用户用Alt+Tab切换到另外的应用E序?
    o Parameters.AllowWindowsKeyQ允许用户用Ctrl+Esc或一UWindows键存取Q务栏和开始菜单?
    o Parameters.AllowAltTabAndWindowsQ启用Alt+TabQCtrl+Esc和W(xu)indows键?
    o Parameters.PassAllKeysToNextAppQ如果该参数为trueQ那么所有的击键被传递给M其它监听应用E序Q包括WindowsQ?
    当击键l被键盘钩子捕获Ӟ启用Alt+Tab?或Windows键允许实际用该计算切换到另一个应用程序ƈ且用鼠标与之交互。PassAllKeysToNextApp讄有效地禁用了击键捕获Q这个类也是建立一个低U键盘钩子ƈ且引发它的KeyIntercepted事gQ但是它q负责把键盘事g传递到另一个监听程序?
    因此Q实例化该类以捕h有击键的Ҏ(gu)如下Q?
    public static KeyboardHook kh;
    [STAThread]
    static void Main()
    {
    //其它代码
    using (kh = new KeyboardHook())
    {
    Application.Run(new Form1());
    }
    ? 处理KeyIntercepted事g
    当一外键被按下时Q这个KeyboardHookcLzM个包含一些KeyboardHookEventArgs的KeyIntercepted事g。这是通过一个KeyboardHookEventHandlercd的方法用以下方式来实现的:(x)
    kh.KeyIntercepted += new KeyboardHook.KeyboardHookEventHandler(kh_KeyIntercepted);
    q个KeyboardHookEventArgsq回关于被按下键的下列信息:(x)
    · KeyNameQ键名,通过把捕L(fng)键代码强制{换ؓ(f)System.Windows.Forms.Keys而获得?
    · KeyCodeQ由键盘钩子q回的原来的键代?
    · PassThroughQ指出是否这个KeyboardHook实例被配|以允许该击键传递到其它应用E序。如果你惛_怸用户使用Alt+Tab?Ctrl+Esc/Windows键切换到其它的应用程序的话,那么对之q行(g)查是很有用的?
    然后Q用一个具有适当{֐的方法来执行击键所调用的Q何Q务。下面是一个示例片断:(x)
    void kh_KeyIntercepted(KeyboardHookEventArgs e)
    {
    //(g)查是否这个键M件被传递到其它应用E序q且停用TopMostQ以防他们需要调到前?br />    if (e.PassThrough)
    {
    this.TopMost = false;
    }
    ds.Draw(e.KeyName);
    }
    本文的剩下部分将解释低键盘钩子是如何在KeyboardHook中实现的?
    ? 实现一个低UWindows API键盘钩子
    在user32.dll中,W(xu)indows API包含三个Ҏ(gu)来实现此目的Q?
    · SetWindowsHookExQ它负责建立键盘钩子
    · UnhookWindowsHookExQ它负责Ud键盘钩子
    · CallNextHookExQ它负责把击键信息传递到下一个监听键盘事件的应用E序
    创徏一个能够拦截键盘的应用E序的关键是Q实现前面两个方法,?攑ּ"W三个。结果是QQ何击键都只能传递到q个应用E序中?
    Z实现q一目标Q第一步是包括System.Runtime.InteropServices命名I间q且导入APIҎ(gu)Q首先是SetWindowsHookExQ?
    using System.Runtime.InteropServices
    ……
    //在类内部Q?br />    [DllImport("user32.dll"Q?CharSet = CharSet.AutoQ?SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHookQ?br />    LowLevelKeyboardProc lpfnQ?IntPtr hModQ?uint dwThreadId);
    导入UnhookWindowsHookEx和CallNextHookEx的代码请见后面的讨论?
    下一步是调用SetWindowsHookEx来徏立钩子,q时需要传递下列四个参敎ͼ(x)
    · idHookQ?
    q个数字军_了要建立的钩子的cd。例如,SetWindowsHookEx可以被用于钩住鼠标事Ӟ当然q有其它事gQ。在本文情况下,我们仅对13有兴,q是键盘钩子的id。ؓ(f)了代码更易MQ我们把它赋值给一个常数WH_KEYBOARD_LL?
    · LpfnQ?
    q是一个指向函数的长指针,该函数将负责处理键盘事g。在C#中,"指针"是通过传递一个代理类型的实例而获得的Q从而之引用一个适当的方法。这是我们在每次使用钩子时所调用的方法?
    q里值得注意的是Q这个代理实例需要被存储于这个类的一个成员变量中。这是ؓ(f)了防止一旦第一个方法调用结束它?x)被作?f)垃圾回收?
    · hModQ?
    建立钩子的应用程序的一个实例句柄。我扑ֈ的绝大多数实例仅把它讄为IntPtr.ZeroQ理由是不大可能存在该应用程序的多个实例。然而,q部分代码用了来自于kernel32.dll的GetModuleHandle来标识准的实例从而ɘq个cLL(fng)zL?
    · dwThreadIdQ?
    当前q程的id。把它设|ؓ(f)0可以使这个钩子成为全局构子Q这是相应于一个低U键盘钩子的正确讄?
    SetWindowsHookExq回一个钩子idQ这个id被用于当应用程序结束时从钩子链中脱钩,因此它需要存储在一个成员变量中以备来使用。KeyboardHookcM的相关代码如下:(x)
    private HookHandlerDelegate proc;
    private IntPtr hookID = IntPtr.Zero;
    private const int WH_KEYBOARD_LL = 13;
    public KeyboardHook()
    {
    proc = new HookHandlerDelegate(HookCallback);
    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
    hookID = SetWindowsHookEx(WH_KEYBOARD_LLQ?procQGetModuleHandle(curModule.ModuleName)Q?0);
    }
    }
    ? 处理键盘事g
    如前面所提及(qing)QSetWindowsHookEx需要一个到被用来处理键盘事件的回调函数的指针。它期望有一个用如下签名的函数Q?
    LRESULT CALLBACK LowLevelKeyboardProc( int nCodeQW(xu)PARAM wParamQLPARAM lParam);
    其实Q徏立一个函数指针的C#Ҏ(gu)使用了一个代理,因此Q向SetWindowsHookEx指出它需要的内容的第一步是使用正确的签名来声明一个代理:(x)
    private delegate IntPtr HookHandlerDelegate(int nCodeQ?IntPtr wParamQ?ref KBDLLHOOKSTRUCT lParam);
    然后Q用相同的{֐~写一个回调方法;q个Ҏ(gu)包含实际上处理键盘事g的所有代码。在KeyboardHook的情况下Q它(g)查是否击键应该被传递给其它应用E序q且接下来激发KeyIntercepted事g。下面是一个简化版本的不带有击键处理代码的情况Q?
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_SYSKEYDOWN = 0x0104;
    private IntPtr HookCallback(int nCodeQ?IntPtr wParamQ?ref KBDLLHOOKSTRUCT lParam)
    {
    //仅ؓ(f)KeyDown事gqo(h)wParamQ否则该代码再ơ执?对于每一ơ击键(也就是,相应于KeyDown和KeyUpQ?br />    //WM_SYSKEYDOWN是捕获Alt相关l合键所必需?br />    if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN))
    {
    //Ȁ发事?br />    OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCodeQ?AllowKey));
    //q回一??g捕获击键
    return (System.IntPtr)1;
    }
    //事g没有被处理,把它传递给下一个应用程?br />    return CallNextHookEx(hookIDQ?nCodeQ?wParamQ?ref lParam);
    }
    接下来,一个到HookCallback的参考被指派lHookHandlerDelegate的一个实例ƈ且被传递到SetWindowsHookEx的调用,正如前一节所展示的?
    无论何时一个键盘事件发生,下列参数被传递给HookCallBackQ?
    · nCode:
    Ҏ(gu)MSDN文档Q回调函数应该返回CallNextHookEx的结果,如果q个值小于零的话。正常的键盘事g返回一个大于或{于零的nCode倹{?
    · wParam:
    q个值指C发生了什么类型的事gQ键被按下还是松开Q以?qing)是否按下的键是一个系l键Q左Ҏ(gu)双的Alt键)?
    · lParam:
    q是一个存储精击键信息的l构Q例如被按键的代码。在KeyboardHook中声明的q个l构如下Q?
    private struct KBDLLHOOKSTRUCT
    {
    public int vkCode;
    int scanCode;
    public int flags;
    int time;
    int dwExtraInfo;
    }
    其中的这两个公共参数是在KeyboardHook中的回调Ҏ(gu)所使用的仅有的两个参数。vkCokeq回虚拟键代码,它能够被强制转换为System.Windows.Forms.Keys以获得键名,而flags昄是否q是一个扩展键Q例如,W(xu)indows Start键)或是否同时按下了Alt键。有关于Hook回调Ҏ(gu)的完整代码展C在每一U情况下要检查哪些flags倹{?
    如果flags提供的信息和KBDLLHOOKSTRUCT的其它组成元素不需要,那么q个回调Ҏ(gu)和代码的{֐可以按如下进行修改:(x)
    private delegate IntPtr HookHandlerDelegate(
    int nCodeQ?IntPtr wParamQ?IntPtr lParam);
    在这U情况中QlParam仅q回vkCode?
    ? 把击键传递到下一个应用程?
    一个良好的键盘钩子回调Ҏ(gu)应该以调用CallNextHookEx函数q且q回它的l果l束。这可以保其它应用E序能够有机?x)处理针对于它们的击键?
    然而,KeyboardHookcȝ主要功能在于Q阻止击键被传播CQ何其它更多的应用E序。因此它无论在何时处理一ơ击键,HookCallback都将q回一个哑|(x)
    return (System.IntPtr)1;
    另一斚wQ它实调用CallNextHookEx-如果它不处理该事Ӟ或如果重载的构造器中的使用KeyboardHook传递的参数允许某些l合键通过?
    CallNextHookEx被启?通过从user32.dll导入该函敎ͼ如下列代码所C:(x)
    [DllImport("user32.dll"Q?CharSet = CharSet.AutoQ?SetLastError = true)]
    private
    static extern IntPtr CallNextHookEx(IntPtr hhkQ?int nCodeQ?br />    IntPtr wParamQ?ref KeyInfoStruct lParam);
    然后Q被导入的方法被HookCallMethod所调用Q这可以保所有的通过钩子接收到的参数被l传递到下一个应用程序中Q?
    CallNextHookEx(hookIDQ?nCodeQ?wParamQ?ref lParam);
    如前面所提及(qing)Q如果在lParam中的flags是不相关的,那么可以修改导入的CallNextHookEx的签名以把lParam定义为System.IntPtr?
    ? Ud钩子
    处理钩子的最后一步是使用从user32.dll中导入的UnhookWindowsHookEx函数Ud它(当破坏KeyboardHookcȝ实例ӞQ如下所C:(x)
    [DllImport("user32.dll"Q?CharSet = CharSet.AutoQ?SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    既然KeyboardHook实现IDisposableQ那么这可以在DisposeҎ(gu)中完成?
    public void Dispose()
    {
    UnhookWindowsHookEx(hookID);
    }
    hookID是构造器在调用SetWindowsHookEx所q回的id。这从钩子链中删除应用E序?br />    c#键盘钩子
    作? lzh cd: C#/VB 日期: 2003-5-27 22:22:19
    You can use system hook to hook any messages send to the application.
    Hooking the keyboard (WH_KEYBOARD) and mouse (WH_MOUSE) messages can be
    used to determine if the user interactive with the computer. You also can
    hook all the messages (WH_GETMESSAGE). The hook can be set with this code:
    public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_GETMESSAGE = 3
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_GETMESSAGE,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //Perform your process
    return 0;
    }
    }
    Then you can install the hook procedure by the following code:
    Win32Hook hook = new Win32Hook();
    hook.SetHook();
    用钩?hook)实现C#的屏q键盘效?br />    -
    SVN技术网 www.svn8.com 2010-01-20 08:38:02 来源:bbs.svn8.com 作?佚名 点击:158?
    文章摘要Q用钩子(hook)实现C#的屏q键盘效?要实C个屏q键盘,需要监听所有键盘事Ӟ无论H体是否被激zR因此需要一个全局的钩子,也就 是系l范围的钩子?什么是钩子QHookQ?钩子QHookQ是Windows提供的一U消息处理机制^収ͼ是指在程序正常运行中接受信息之前预先启动的函敎ͼ用来(g)查和修改传给该程序的信息Q(钩子Q?
    -
    使用完钩子后Q要q行卸蝲Q这个可以写在析构函C?br />    12 public void Stop() {3 this.Stop(true, true, true);4 }5 6 public void Stop(bool uninstallMouseHook, bool uninstallKeyboardHook, 7 bool throwExceptions) {8 // if mouse hook set and must be uninstalled9 if (hMouseHook != IntPtr.Zero && uninstallMouseHook) {10 // uninstall hook11 bool retMouse = UnhookWindowsHookEx(hMouseHook);12 // reset invalid handle13 hMouseHook = IntPtr.Zero;14 // if failed and exception must be thrown15 if (retMouse == false && throwExceptions) {16 // Returns the error code returned by the last unmanaged function 17 // called using platform invoke that has the DllImportAttribute.18 // SetLastError flag set. 19 int errorCode = Marshal.GetLastWin32Error();20 // Initializes and throws a new instance of the Win32Exception class 21 // with the specified error. 22 throw new Win32Exception(errorCode);23 }24 }2526 // if keyboard hook set and must be uninstalled27 if (hKeyboardHook != IntPtr.Zero && uninstallKeyboardHook) {28 // uninstall hook29 bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook);30 // reset invalid handle31 hKeyboardHook = IntPtr.Zero;32 // if failed and exception must be thrown33 if (retKeyboard == false && throwExceptions) {34 // Returns the error code returned by the last unmanaged function 35 // called using platform invoke that has the DllImportAttribute.36 // SetLastError flag set. 37 int errorCode = Marshal.GetLastWin32Error();38 // Initializes and throws a new instance of the Win32Exception class 39 // with the specified error. 40 throw new Win32Exception(errorCode);41 }42 }43 }44
    这个文件编译成一个dllQ即可在应用E序中调用。通过它提供的事gQ便可监听所有的键盘事g?br />    但是Q这只能监听键盘事gQ没有键盘的情况下,怎么?x)有键盘事gQ其实很单,通过SendInput
    API函数提供虚拟键盘代码的调用即可模拟键盘输入。下面的代码模拟一?KeyDown ?KeyUp q程Q?br />    把他们连接v来就是一ơ按键过E?br />    1 private void SendKeyDown(short key) {2 Input[] input = new Input[1];3 input[0].type = INPUT.KEYBOARD;4 input[0].ki.wVk = key;5 input[0].ki.time = NativeMethods.GetTickCount();67 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])) 8 < input.Length) {9 throw new Win32Exception(Marshal.GetLastWin32Error());10 }11 }1213 private void SendKeyUp(short key) {14 Input[] input = new Input[1];15 input[0].type = INPUT.KEYBOARD;16 input[0].ki.wVk = key;17 input[0].ki.dwFlags = KeyboardConstaint.KEYEVENTF_KEYUP;18 input[0].ki.time = NativeMethods.GetTickCount();1920 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]))21 < input.Length) {22 throw new Win32Exception(Marshal.GetLastWin32Error());23 }24 }
    自己实现一?KeyBoardButton 控g用作按钮Q用 Visual Studio 或?SharpDevelop 为屏q键盘设?UIQ然?br />    在这?Button ?Click 事g里面模拟一个按键过E?br />    12 private void ButtonOnClick(object sender, EventArgs e) {3 KeyboardButton btnKey = sender as KeyboardButton;4 if (btnKey == null) {5 return;6 }78 SendKeyCommand(btnKey);9 }10 11 private void SendKeyCommand(KeyboardButton keyButton) {12 short key = keyButton.VKCode;13 if (combinationVKButtonsMap.ContainsKey(key)) {14 if (keyButton.Checked) {15 SendKeyUp(key);16 } else {17 SendKeyDown(key);18 }19 } else {20 SendKeyDown(key);21 SendKeyUp(key);22 }23 }
    其中 combinationVKButtonsMap 是一?IDictionary>, key 存储的是VK_SHIFT, VK_CONTROL {组合键的键盘码。左右两个按钮对应同一个键盘码Q因此需要放在一?List 里?br />    标准键盘上的每一个键都有虚拟键码( VK_CODE)与之对应。还有一些其他的帔RQ?br />    把它写在一个静?class 里吧?br />    1 // KeyboardConstaint.cs2 internal static class KeyboardConstaint {3 internal static readonly short VK_F1 = 0x70;4 internal static readonly short VK_F2 = 0x71;5 internal static readonly short VK_F3 = 0x72;6 internal static readonly short VK_F4 = 0x73;7 internal static readonly short VK_F5 = 0x74;8 internal static readonly short VK_F6 = 0x75;9 internal static readonly short VK_F7 = 0x76;10 internal static readonly short VK_F8 = 0x77;11 internal static readonly short VK_F9 = 0x78;12 internal static readonly short VK_F10 = 0x79;13 internal static readonly short VK_F11 = 0x7A;14 internal static readonly short VK_F12 = 0x7B;1516 internal static readonly short VK_LEFT = 0x25;17 internal static readonly short VK_UP = 0x26;18 internal static readonly short VK_RIGHT = 0x27;19 internal static readonly short VK_DOWN = 0x28;2021 internal static readonly short VK_NONE = 0x00;22 internal static readonly short VK_ESCAPE = 0x1B;23 internal static readonly short VK_EXECUTE = 0x2B;24 internal static readonly short VK_CANCEL = 0x03;25 internal static readonly short VK_RETURN = 0x0D;26 internal static readonly short VK_ACCEPT = 0x1E;27 internal static readonly short VK_BACK = 0x08;28 internal static readonly short VK_TAB = 0x09;29 internal static readonly short VK_DELETE = 0x2E;30 internal static readonly short VK_CAPITAL = 0x14;31 internal static readonly short VK_NUMLOCK = 0x90;32 internal static readonly short VK_SPACE = 0x20;33 internal static readonly short VK_DECIMAL = 0x6E;34 internal static readonly short VK_SUBTRACT = 0x6D;3536 internal static readonly short VK_ADD = 0x6B;37 internal static readonly short VK_DIVIDE = 0x6F;38 internal static readonly short VK_MULTIPLY = 0x6A;39 internal static readonly short VK_INSERT = 0x2D;4041 internal static readonly short VK_OEM_1 = 0xBA; // ';:' for US42 internal static readonly short VK_OEM_PLUS = 0xBB; // '+' any country4344 internal static readonly short VK_OEM_MINUS = 0xBD; // '-' any country4546 internal static readonly short VK_OEM_2 = 0xBF; // '/?' for US47 internal static readonly short VK_OEM_3 = 0xC0; // '`~' for US48 internal static readonly short VK_OEM_4 = 0xDB; // '[{' for US49 internal static readonly short VK_OEM_5 = 0xDC; // '\|' for US50 internal static readonly short VK_OEM_6 = 0xDD; // ']}' for US51 internal static readonly short VK_OEM_7 = 0xDE; // ''"' for US52 internal static readonly short VK_OEM_PERIOD = 0xBE; // '.>' any country53 internal static readonly short VK_OEM_COMMA = 0xBC; // ',<' any country54 internal static readonly short VK_SHIFT = 0x10;55 internal static readonly short VK_CONTROL = 0x11;56 internal static readonly short VK_MENU = 0x12;57 internal static readonly short VK_LWIN = 0x5B;58 internal static readonly short VK_RWIN = 0x5C;59 internal static readonly short VK_APPS = 0x5D;6061 internal static readonly short VK_LSHIFT = 0xA0;62 internal static readonly short VK_RSHIFT = 0xA1;63 internal static readonly short VK_LCONTROL = 0xA2;64 internal static readonly short VK_RCONTROL = 0xA3;65 internal static readonly short VK_LMENU = 0xA4;66 internal static readonly short VK_RMENU = 0xA5;6768 internal static readonly short VK_SNAPSHOT = 0x2C;69 internal static readonly short VK_SCROLL = 0x91;70 internal static readonly short VK_PAUSE = 0x13;71 internal static readonly short VK_HOME = 0x24;7273 internal static readonly short VK_NEXT = 0x22;74 internal static readonly short VK_PRIOR = 0x21;75 internal static readonly short VK_END = 0x23;7677 internal static readonly short VK_NUMPAD0 = 0x60;78 internal static readonly short VK_NUMPAD1 = 0x61;79 internal static readonly short VK_NUMPAD2 = 0x62;80 internal static readonly short VK_NUMPAD3 = 0x63;81 internal static readonly short VK_NUMPAD4 = 0x64;82 internal static readonly short VK_NUMPAD5 = 0x65;83 internal static readonly short VK_NUMPAD5NOTHING = 0x0C;84 internal static readonly short VK_NUMPAD6 = 0x66;85 internal static readonly short VK_NUMPAD7 = 0x67;86 internal static readonly short VK_NUMPAD8 = 0x68;87 internal static readonly short VK_NUMPAD9 = 0x69;8889 internal static readonly short KEYEVENTF_EXTENDEDKEY = 0x0001;90 internal static readonly short KEYEVENTF_KEYUP = 0x0002;9192 internal static readonly int GWL_EXSTYLE = -20;93 internal static readonly int WS_DISABLED = 0X8000000;94 internal static readonly int WM_SETFOCUS = 0X0007;95 }
    文章来自[SVN中文技术网]转发请保留本站地址Qhttp://www.svn8.com/dotnet/Csharp/2010012018328_2.html
    C#中键盘钩子的使用Q{)
    public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //在这里放|你的处理代?return 0;
    }
    }
    使用Ҏ(gu)
    可以在Form的构造函数里攑օ
    Win32Hook hook = new Win32Hook();
    hook.SetHook();

ZT文萃 2013-11-14 07:56 发表评论
]]>
c#键盘钩子 http://www.tkk7.com/longturi/archive/2013/11/13/406294.htmlZT文萃ZT文萃Wed, 13 Nov 2013 06:21:00 GMThttp://www.tkk7.com/longturi/archive/2013/11/13/406294.htmlhttp://www.tkk7.com/longturi/comments/406294.htmlhttp://www.tkk7.com/longturi/archive/2013/11/13/406294.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/406294.htmlhttp://www.tkk7.com/longturi/services/trackbacks/406294.htmlhttp://wuqinzhong.blog.163.com/blog/static/45222312009101711583439/

c#键盘钩子  

2009-11-17 11:58:34|  分类Q? C# |字号 订阅

c#键盘钩子Q?

    public class Win32Hook
    {

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

        [DllImport("user32",CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(HookType idHook, HOOKPROC lpfn, int hmod, int dwThreadId);
        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int hhk,int nCode,int wParam,int lParam);
        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnHookWindowsHookEx(int hhk);

        public enum HookType
        {
            WH_KEYBOARD = 2
        }

        public delegate int HOOKPROC(int nCode, int wParam, int lParam);
        public int hhk;

        public void SetHook()
        {
            // set the keyboard hook
            hhk = SetWindowsHookEx(HookType.WH_KEYBOARD, new HOOKPROC(this.MyKeyboardProc), 0, GetCurrentThreadId());
        }

        public int MyKeyboardProc(int nCode, int wParam, int lParam)
        {
            //在这里放|你的处理代?br />            int iresult = 0;
            if (nCode<=0)
            {
                iresult = CallNextHookEx(hhk, nCode, wParam, lParam);
                return iresult;
            }
            if ((wParam >= 48 && wParam<=57)||(wParam >= 65 && wParam<=90)||(wParam >= 97 && wParam<=122))
            {
                Form1.rrrr += Convert.ToChar(wParam);
                return 0;
            }

            return 0;
        }
        public bool UnHook()
        {
           return UnHookWindowsHookEx(hhk);
        }

    }

使用Q?

Win32Hook hook = new Win32Hook();
            hook.SetHook();

            this.richTextBox2.Text = rrrr;
            hook.UnHook();

参考:(x)http://baike.baidu.com/view/1208620.htm

使用参照Q?a rel="nofollow" >http://www.codeproject.com/KB/system/globalsystemhook.aspx

             (adamhtmei)



ZT文萃 2013-11-13 14:21 发表评论
]]>
jquery操作下拉?/title><link>http://www.tkk7.com/longturi/archive/2013/10/09/404799.html</link><dc:creator>ZT文萃</dc:creator><author>ZT文萃</author><pubDate>Wed, 09 Oct 2013 07:23:00 GMT</pubDate><guid>http://www.tkk7.com/longturi/archive/2013/10/09/404799.html</guid><wfw:comment>http://www.tkk7.com/longturi/comments/404799.html</wfw:comment><comments>http://www.tkk7.com/longturi/archive/2013/10/09/404799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/longturi/comments/commentRss/404799.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/longturi/services/trackbacks/404799.html</trackback:ping><description><![CDATA[<span> </span><div><p><span>jQuery获取Select选择的Text和Value:<br /></span><span>语法解释Q?br /></span><span>1.  $("#select_id").change(function(){//code...});   //为Selectd事gQ当选择其中一Ҏ(gu)触发<br /></span><span>2.  var checkText=$("#select_id").find("option:selected").text();   //获取Select选择的Text<br /></span><span>3. var checkValue=$("#select_id").val();   //获取Select选择的Value<br /></span><span>4. var checkIndex=$("#select_id ").get(0).selectedIndex;   //获取Select选择的烦引?br /></span><span>5. var maxIndex=$("#select_id option:last").attr("index");   //获取Select最大的索引?br /></span><span>jQuery讄Select选择?nbsp;Text和Value:<br /></span><span>语法解释Q?br /></span><span>1. $("#select_id  ").get(0).selectedIndex=1;  //讄Select索引gؓ(f)1的项选中<br /></span><span>2. $("#select_id ").val(4);    // 讄Select的Valuegؓ(f)4的项选中<br /></span><span>3. $("#select_id  option[text='jQuery']").attr("selected", true);   //讄Select的Textgؓ(f)jQuery的项选中  </span></p><p><span>jQueryd/删除Select的Option:(x)<br /></span><span>语法解释Q?br /></span><span>1.  $("#select_id").append("<option value='Value'>Text</option>");   //为Selectq加一个Option(下拉?<br /></span><span>2. $("#select_id").prepend("<option  value='0'>请选择</option>");  //为Select插入一个Option(W一个位|?<br /></span><span>3.  $("#select_id option:last").remove();  //删除Select中烦引值最大Option(最后一?<br /></span><span>4.  $("#select_id option[index='0']").remove();  //删除Select中烦引gؓ(f)0的Option(W一?<br /></span><span>5.  $("#select_id option[value='3']").<span style="font-size: 12px;">remove</span></span><span>();   //删除Select中Value='3'的Option<br /></span><span>5. $("#select_id option[text='4']").remove();   //删除Select中Text='4'的Option </span></p><p><span>http://www.cnblogs.com/SAL2928/archive/2008/10/28/1321285.html  </span></p><p><span>jquery  radio取|checkbox取|select取|radio选中Qcheckbox选中Qselect选中Q及(qing)其相?nbsp;<br /></span><span>?nbsp; 取一lradio被选中的?nbsp;<br /></span><span>var item = $('input[name=items][checked]').val(); <br /></span><span>?nbsp; 取select被选中的文本 <br /></span><span>var item = $("select[name=items] option[selected]").text();  <br /></span><span>select下拉框的W二个元素ؓ(f)当前选中?nbsp;<br /></span><span>$('#select_id')[0].selectedIndex = 1;  <br /></span><span>radio单选组的第二个元素为当前选中?nbsp;<br /></span><span>$('input[name=items]').get(1).checked = true;  <br /></span><span>获取|(x) <br /></span><span>文本框,文本区域Q?("#txt").attr("value")Q?nbsp;<br /></span><span>多选框  checkboxQ?("#checkbox_id").attr("value")Q?nbsp;<br /></span><span>单选组radioQ?nbsp;   $("input[type=radio][checked]").val(); <br /></span><span>下拉框selectQ?nbsp;$('#sel').val();  <br /></span><span>控制表单元素Q?nbsp;<br /></span><span>文本框,文本区域Q?("#txt").attr("value",'');//清空内容  <br /></span><span>$("#txt").attr("value",'11');//填充内容 <br /></span><span>多选框checkboxQ?nbsp; $("#chk1").attr("checked",'');//不打?nbsp;<br /></span><span>$("#chk2").attr("checked",true);//打勾  <br /></span><span>if($("#chk1").attr('checked')==undefined) //判断是否已经打勾 <br /></span><span>单选组 radioQ?nbsp;    $("input[type=radio]").attr("checked",'2');//讄value=2的项目ؓ(f)当前选中?nbsp;<br /></span><span>下拉?nbsp; selectQ?nbsp;  $("#sel").attr("value",'-sel3');//讄value=-sel3的项目ؓ(f)当前选中?nbsp; <br /></span><span>$("<option value='1'>1111</option><option  value='2'>2222</option>").appendTo("#sel")//d下拉框的option  <br /></span><span>$("#sel").empty()Q?/清空下拉?nbsp;</span></p><p><span>----------------------------------------------------------------------------------------------------  </span></p><p><span>//遍历option和添加、移除option<br /></span><span>function  changeShipMethod(shipping){<br /></span><span>var len = $("select[name=ISHIPTYPE]  option").length<br /></span><span>if(shipping.value != "CA"){<br /></span><span>$("select[name=ISHIPTYPE]  option").each(function(){<br /></span><span>if($(this).val() ==  111){<br /></span><span>$(this).remove();<br /></span><span>}<br /></span><span>});<br /></span><span>}else{<br /></span><span>$("<option  value='111'>UPS  Ground</option>").appendTo($("select[name=ISHIPTYPE]"));<br /></span><span>}<br /></span><span>}  </span></p><p><span>//取得下拉選單的選取?nbsp;</span></p><p><span>$(#testSelect  option:selected').text();<br /></span><span>?("#testSelect").find('option:selected').text();<br /></span><span>?("#testSelect").val();<br /></span><span>//////////////////////////////////////////////////////////////////<br /></span><span>?nbsp; 性不好的可以收藏下:(x)<br /></span><span>1,下拉? </span></p><p><span>var cc1 = $(".formc select[name='country']  option[selected]").text(); //得到下拉菜单的选中的文本(注意中间有空?<br /></span><span>var cc2 = $('.formc  select[name="country"]').val(); //得到下拉菜单的选中的?br /></span><span>var cc3 = $('.formc  select[name="country"]').attr("id");  //得到下拉菜单的选中的ID属性?br /></span><span>$("#select").empty();//清空下拉?nbsp; //$("#select").html('');<br /></span><span>$("<option  value='1'>1111</option>").appendTo("#select")//d下拉框的option </span></p><p><span>E微解释一?<br /></span><span>1.select[name='country'] option[selected]  表示hname 属性,<br /></span><span>q?nbsp;且该属性gؓ(f)'country' 的select元素 里面的具有selected 属性的option 元素Q?nbsp; </span></p><p><span>2,单选框:<br /></span><span>$("input[@type=radio][@checked]").val();  //得到单选框?nbsp; 选中的?注意中间没有I格)<br /></span><span>$("input[@type=radio][@value=2]").attr("checked",'checked');  //讄单选框value=2的ؓ(f)选中状?(注意中间没有I格) </span></p><p><span>3,复选框:<br /></span><span>$("input[@type=checkbox][@checked]").val();  //得到复选框的选中的第一的?br /></span><span>$("input[@type=checkbox][@checked]").each(function() {  //׃复选框一般选中的是多个,所以可以@环输?br /></span><span>alert($(this).val());<br /></span><span>}); </span></p><p><span>$("#chk1").attr("checked",'');//不打?br /></span><span>$("#chk2").attr("checked",true);//  打勾<br /></span><span>if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾 </span></p><p><span>当然jquery的选择器是强大? q有很多Ҏ(gu). </span></p><p><span><script src="jquery-1.2.1.js"  type="text/javascript"></script><br /></span><span><script language="javascript"  type="text/javascript"><br /></span><span>$(document).ready(function(){<br /></span><span>$("#selectTest").change(function()<br /></span><span>{<br /></span><span>//alert("Hello");<br /></span><span>//alert($("#selectTest").attr("name"));<br /></span><span>//$("a").attr("href","xx.html");<br /></span><span>//window.location.href="xx.html";<br /></span><span>//alert($("#selectTest").val());<br /></span><span>alert($("#selectTest  option[@selected]").text());<br /></span><span>$("#selectTest").attr("value", "2"); </span></p><p><span>});<br /></span><span>});<br /></span><span></script> </span></p><p><span><a href="#">aaass</a> </span></p><p><span><!--下拉?-><br /></span><span><select id="selectTest"  name="selectTest"><br /></span><span><option value="1">11</option><br /></span><span><option  value="2">22</option><br /></span><span><option  value="3">33</option><br /></span><span><option  value="4">44</option><br /></span><span><option  value="5">55</option><br /></span><span><option  value="6">66</option><br /></span><span></select><br /></span><span>jquery  radio取|checkbox取|select取|radio选中Qcheckbox选中Qselect选中Q及(qing)其相兌取一lradio被选中  的?br /></span><span>var item = $('input[@name=items][@checked]').val();<br /></span><span>获取select被?nbsp; 中项的文?br /></span><span>var item = $("select[@name=items] option[@selected]").text();<br /></span><span>select  下拉框的W二个元素ؓ(f)当前选中?br /></span><span>$('#select_id')[0].selectedIndex = 1;<br /></span><span>radio单选组的第二个  元素为当前选中?br /></span><span>$('input[@name=items]').get(1).checked = true;<br /></span><span>获取|(x)<br /></span><span>文本  框,文本区域Q?("#txt").attr("value")Q?br /></span><span>多选框  checkboxQ?("#checkbox_id").attr("value")Q?br /></span><span>单选组radioQ?nbsp; $("input[@type=radio][@checked]").val();<br /></span><span>下拉框selectQ?nbsp;$('#sel').val();<br /></span><span>?nbsp; 制表单元素:(x)<br /></span><span>文本框,文本区域Q?("#txt").attr("value",'');//清空内容<br /></span><span>$("#txt").attr("value",'11');//  填充内容<br /></span><span>多选框checkboxQ?nbsp; $("#chk1").attr("checked",'');//不打?br /></span><span>$("#chk2").attr("checked",true);//  打勾<br /></span><span>if($("#chk1").attr('checked')==undefined) //判断是否已经打勾<br /></span><span>单选组radioQ?nbsp; $("input[@type=radio]").attr("checked",'2');//讄value=2的项目ؓ(f)当前选中?br /></span><span>下拉?nbsp;selectQ?nbsp; $("#sel").attr("value",'-sel3');//讄value=-sel3的项目ؓ(f)当前选中?br /></span><span>$("<optionvalue='1'&  gt;1111</option><optionvalue='2'>2222</option&  gt;").appendTo("#sel")//d下拉框的option<br /></span><span>$("#sel").empty()Q?/ 清空下拉?nbsp;</span></p><p><span>获取一lradio被选中的?br /></span><span>var item =  $('input[@name=items][@checked]').val();<br /></span><span>获取select被选中的文本<br /></span><span>var item =  $("select[@name=items] option[@selected]").text();<br /></span><span>select下拉框的W二个元素ؓ(f)?nbsp; 前选中?br /></span><span>$('#select_id')[0].selectedIndex =  1;<br /></span><span>radio单选组的第二个元素为当前选中?br /></span><span>$('input[@name=items]').get(1).checked =  true;<br /></span><span>获取|(x)<br /></span><span>文本框,文本区域Q?("#txt").attr("value")Q?br /></span><span>多选框  checkboxQ?("#checkbox_id").attr("value")Q?br /></span><span>单选组radioQ?nbsp; $("input[@type=radio][@checked]").val();<br /></span><span>下拉框selectQ?nbsp;$('#sel').val();<br /></span><span>?nbsp; 制表单元素:(x)<br /></span><span>文本框,文本区域Q?("#txt").attr("value",'');//清空内容<br /></span><span>$("#txt").attr("value",'11');//  填充内容<br /></span><span>多选框checkboxQ?nbsp; $("#chk1").attr("checked",'');//不打?br /></span><span>$("#chk2").attr("checked",true);//  打勾<br /></span><span>if($("#chk1").attr('checked')==undefined) //判断是否已经打勾<br /></span><span>单选组radioQ?nbsp; $("input[@type=radio]").attr("checked",'2');//讄value=2的项目ؓ(f)当前选中?br /></span><span>下拉?nbsp;selectQ?nbsp; $("#sel").attr("value",'-sel3');//讄value=-sel3的项目ؓ(f)当前选中?br /></span><span>$("<option  value='1'>1111</option><option  value='2'>2222</option>").appendTo("#sel")//d下拉框的option<br /></span><span>$("#sel").empty()Q?/  清空下拉?<br /></span></p></div><img src ="http://www.tkk7.com/longturi/aggbug/404799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/longturi/" target="_blank">ZT文萃</a> 2013-10-09 15:23 <a href="http://www.tkk7.com/longturi/archive/2013/10/09/404799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>便于邮g里用的l线Ҏ(gu)http://www.tkk7.com/longturi/archive/2013/09/16/404124.htmlZT文萃ZT文萃Mon, 16 Sep 2013 04:28:00 GMThttp://www.tkk7.com/longturi/archive/2013/09/16/404124.htmlhttp://www.tkk7.com/longturi/comments/404124.htmlhttp://www.tkk7.com/longturi/archive/2013/09/16/404124.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/404124.htmlhttp://www.tkk7.com/longturi/services/trackbacks/404124.html<table width="450" border="1" style="border-collapse:collapse;" bordercolor="#336699">
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
</table>

ZT文萃 2013-09-16 12:28 发表评论
]]>
DIV+CSS圆角Ҏ(gu)http://www.tkk7.com/longturi/archive/2013/09/15/404094.htmlZT文萃ZT文萃Sun, 15 Sep 2013 10:33:00 GMThttp://www.tkk7.com/longturi/archive/2013/09/15/404094.htmlhttp://www.tkk7.com/longturi/comments/404094.htmlhttp://www.tkk7.com/longturi/archive/2013/09/15/404094.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/404094.htmlhttp://www.tkk7.com/longturi/services/trackbacks/404094.html阅读全文

ZT文萃 2013-09-15 18:33 发表评论
]]>
HTML中的转义字符http://www.tkk7.com/longturi/archive/2013/09/13/404038.htmlZT文萃ZT文萃Fri, 13 Sep 2013 04:54:00 GMThttp://www.tkk7.com/longturi/archive/2013/09/13/404038.htmlhttp://www.tkk7.com/longturi/comments/404038.htmlhttp://www.tkk7.com/longturi/archive/2013/09/13/404038.html#Feedback0http://www.tkk7.com/longturi/comments/commentRss/404038.htmlhttp://www.tkk7.com/longturi/services/trackbacks/404038.htmlHTML?lt;, >Q?amp;{有Ҏ(gu)含义Q?前两个字W用于链接签Q?amp;用于转义)Q不能直接用。用这三个字符Ӟ应用它们的转义序列Q如下所C:(x)

&amp; ?&

&

?/p>

&lt; ?<

<

 

 

于?/p>

&gt; ?>

>

 

 

大于?/p>

&quot;

"

双引?/p>

 

&nbsp;

 

 

I格

&copy;

©

版权W?/p>

&reg

®

 

 

注册W?/p>







  前者ؓ(f)字符转义序列Q后者ؓ(f)数字转义序列。数字{为字W对应的ASCII码倹{例如 & lt; font &gt;昄为,<font>Q若直接写ؓ(f)则被认ؓ(f)是一个链接签?/p>

ZT文萃 2013-09-13 12:54 发表评论
]]>
վ֩ģ壺 6080yyþԹ| ʪһҹƷѸ | 57paoƵ| WWW޾Ʒþ鶹| Ʒþþþþþþ| 59paoɹƵ| ѹۿ| avһ| ӰԺѹۿ| լa| ˾Ʒ| ޹Ʒۺɫ| 69avѹۿ| ƵС˵ͼƬ| 18Ůվ | һ| ɫվWWWĻ| ƵƷ| ޾Ʒר| ߹ۿѾƷ| ޸岻Ƶ| 91鶹˳ѹۿ| ߲| ѹۿվ| þþþþavѿ| ձŷɫƵ߲| һaëƬƵ| ޹AVһ| ŮڵƵվ| ҳַȫѹۿ12վ| պƷһ| aһƬ| Ʒ޳| һѲ| ҳ߹ۿ| Ļ߿˶Ƭ| AVҹƬ| vƬ߹ۿƵվ| ɫWW47 | þþƷһԡ | ƵƵ|