zoukankan      html  css  js  c++  java
  • WIN32 API编程初学习和资料积累

         自己之前对WIN API编程一直是望而生畏,没有信心和毅力去学习。但是进行Windows编程人员或多或少地会遇到或使用到WIN API。无论你是JAVA或NET程序员,都是间接使用了WIN API,两个运行环境只是对WIN API进行了一层不同的封装而已。

      《精通.NET互操作》深入讲解了P/Invoke, C++ Interop 和COM Interop。由于该书讲解较深,有点枯燥,我每次也就看个五六页。如果想了解互操作或进行WIN API编程的,建议阅读。

      下面是我使用和看过的两个实例:

      1.动态显示窗口

            #region 动画启动窗体
            [DllImportAttribute(
    "user32.dll")]
            private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
            
    /*
            1. AW_SLIDE : 使用滑动类型, 默认为该类型. 当使用 AW_CENTER 效果时, 此效果被忽略
            2. AW_ACTIVE: 激活窗口, 在使用了 AW_HIDE 效果时不可使用此效果
            3. AW_BLEND: 使用淡入效果
            4. AW_HIDE: 隐藏窗口
            5. AW_CENTER: 与 AW_HIDE 效果配合使用则效果为窗口几内重叠,  单独使用窗口向外扩展.
            6. AW_HOR_POSITIVE : 自左向右显示窗口
            7. AW_HOR_NEGATIVE: 自右向左显示窗口
            8. AW_VER_POSITVE: 自顶向下显示窗口
            9. AW_VER_NEGATIVE : 自下向上显示窗口
            
    */
            
    public const Int32 AW_HOR_POSITIVE = 0x00000001;
            
    public const Int32 AW_HOR_NEGATIVE = 0x00000002;
            
    public const Int32 AW_VER_POSITIVE = 0x00000004;
            
    public const Int32 AW_VER_NEGATIVE = 0x00000008;
            
    public const Int32 AW_CENTER = 0x00000010;
            
    public const Int32 AW_HIDE = 0x00010000;
            
    public const Int32 AW_ACTIVATE = 0x00020000;
            
    public const Int32 AW_SLIDE = 0x00040000;
            
    public const Int32 AW_BLEND = 0x00080000;

            
    //动态关闭窗体
            private void XFormMain_FormClosed(object sender, FormClosedEventArgs e)
            {
                
    //动态关闭窗体
                AnimateWindow(this.Handle, 800, AW_SLIDE + AW_HIDE + AW_CENTER);
            }

            
    #endregion

            
    public XFormMain()
            {
                InitializeComponent();

                
    //动画启动
                AnimateWindow(this.Handle, 800, AW_SLIDE + AW_CENTER);
            }

       user32.dll存在于C:\WINDOWS\system32,调用AnimateWindow函数方法实现窗口的动态显示。可以查看MSDN来获取该方法的详细说明。

     2.VS2005中文输入法自动转换为全角的两种解决方法

    引自:http://www.cnblogs.com/name-lh/archive/2006/04/13/374337.html

    //VS2005中文输入法自动转换为全角的两种解决方法 ----- 之二 ----- 使用继承的方法

    //最近在用VS2005做项目的时候,一直忍受着VS2005输入法自动切换到全角的Bug的作怪,一边等待
    //着微软给我们一个解决的方案。但是,我的项目都要作为产品打包出去了,微软还是闷头不对
    //这个Bug出一个解决方法。怎么办?我可以忍受这个输入法来回切换之苦,可用户体验可不会饶过我们的。
    //弄不好,来个集体罢用,让我们都到微软喝西北风去啊!
    //总不能就这么交出产品出去吧,只有自己动手了。下面我用两种方法来实现如何避免输入法的这个Bug。 

    //首先,建立一个独立的类如下: 
    //使用这个类的方法为: 
    //      修改所有的Form的继承关系,比如,你有这样的一个Form类:
    //public partial class Form1 :ImeForm
    //{
    //    // ...
    //}

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

    namespace Controls.Windows
    {
        
    public class ImeForm : System.Windows.Forms.Form
        {
            
    //声明一些API函数
            [DllImport("imm32.dll")]
            
    public static extern IntPtr ImmGetContext(IntPtr hwnd);
            [DllImport(
    "imm32.dll")]
            
    public static extern bool ImmGetOpenStatus(IntPtr himc);
            [DllImport(
    "imm32.dll")]
            
    public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);
            [DllImport(
    "imm32.dll")]
            
    public static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);
            [DllImport(
    "imm32.dll")]
            
    public static extern int ImmSimulateHotKey(IntPtr hwnd, int lngHotkey);
            
    private const int IME_CMODE_FULLSHAPE = 0x8;
            
    private const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11;
            
    //重载Form的OnActivated
            protected override void OnActivated(EventArgs e)
            {
                
    base.OnActivated(e);
                IntPtr HIme 
    = ImmGetContext(this.Handle);
                
    if (ImmGetOpenStatus(HIme))  //如果输入法处于打开状态
                {
                    
    int iMode = 0;
                    
    int iSentence = 0;
                    
    bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence);  //检索输入法信息
                    if (bSuccess)
                    {
                        
    if ((iMode & IME_CMODE_FULLSHAPE) > 0)   //如果是全角
                            ImmSimulateHotKey(this.Handle, IME_CHOTKEY_SHAPE_TOGGLE);  //转换成半角
                    }

                }
            }
        }
    }

      以前在vs2005开发会遇到该问题,但是MS已经给出补丁了,不会再出现该问题,我们只是想看看imm32.dll中三个方法的使用。

      上面两个例子,向我们展示如何使用WIN API编程,涉及到函数方法的查询和常量定义的值的查询。函数查询主要是使用MSDN,MSDN是最权威的。至于常量值查询可使用网上的小工具。WIN API编程工具推荐:http://bbs.eyuyan.com/TopicOther.asp?t=5&BoardID=124&id=202857&page=1,其中《API常量查询1.0》和《易用api伴侣》较好

     

  • 相关阅读:
    Error -26631: HTTP Status-Code=400 (Bad Request) for
    mysql中的制表符替换
    mysql中json数据的拼接方式
    使用Nightwatch.js做基于浏览器的web应用自动测试
    Selenium + Nightwatch 自动化测试环境搭建
    Python web 框架:web.py
    转 Python Selenium设计模式-POM
    自动化测试
    日志打印longging模块(控制台和文件同时输出)
    读取配置文件(configparser,.ini文件)
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1649113.html
Copyright © 2011-2022 走看看