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   e xtern   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来获取该方法的详细说明。

WIN32 API编程初学习和资料积累_第1张图片

 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伴侣》较好

 

你可能感兴趣的:(Win32)