偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#調(diào)用Windows API實(shí)現(xiàn)自動(dòng)登錄

開(kāi)發(fā) 后端
本文主要闡述了C#調(diào)用Windows API實(shí)現(xiàn)自動(dòng)登錄的設(shè)計(jì)初衷、設(shè)計(jì)思想和設(shè)計(jì)步驟,希望對(duì)大家有用。

設(shè)計(jì)初衷:

公司為了安全性考慮,不讓密碼被太多人知道,所以想實(shí)現(xiàn)一個(gè)自動(dòng)登錄的模塊。

設(shè)計(jì)思想:

主要是通過(guò)C#調(diào)用Windows API中的一些方法,找到目標(biāo)窗口和進(jìn)程之后把保存在數(shù)據(jù)庫(kù)中的用戶(hù)名密碼自動(dòng)填入輸入框中,并登錄。

設(shè)計(jì)步驟:

一、調(diào)用Windows API。

 C#調(diào)用Windows API方法如下:

 1、引入命名空間:using System.Runtime.InteropServices;

 2、引用需要使用的方法,格式:[DllImport("DLL文件")]方法的聲明;

  1.  [DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);  
  2.  [DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);  
  3.  [DllImport("user32.dll")]private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);  
  4.  [DllImport("user32.dll")]private static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);  
  5.  [DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);  
  6.  [DllImport("user32.dll")]private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);  
  7.  [DllImport("user32.dll")]private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);  
  8.  [DllImport("user32.dll")]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);   
  9.  //ShowWindow參數(shù)  
  10.  private const int SW_SHOWNORMAL = 1;  
  11.  private const int SW_RESTORE = 9;  
  12.  private const int SW_SHOWNOACTIVATE = 4;  
  13.  //SendMessage參數(shù)  
  14.  private const int WM_KEYDOWN = 0X100;  
  15.  private const int WM_KEYUP = 0X101;  
  16.  private const int WM_SYSCHAR = 0X106;  
  17.  private const int WM_SYSKEYUP = 0X105;  
  18.  private const int WM_SYSKEYDOWN = 0X104;  
  19.  private const int WM_CHAR = 0X102; 

二、找到目標(biāo)窗口

1)、根據(jù)窗口的標(biāo)題得到句柄

 IntPtr myIntPtr = FindWindow(null,"窗口名"); //null為類(lèi)名,可以用Spy++得到,也可以為空

 ShowWindow(myIntPtr, SW_RESTORE); //將窗口還原

 SetForegroundWindow(myIntPtr); //如果沒(méi)有ShowWindow,此方法不能設(shè)置最小化的窗口

2)、遍歷所有窗口得到句柄

1 定義委托方法CallBack,枚舉窗口API(EnumWindows),得到窗口名API(GetWindowTextW)和得到窗口類(lèi)名API(GetClassNameW)

  1.  public delegate bool CallBack(int hwnd, int lParam);  
  2.  [DllImport("user32")]public static extern int EnumWindows(CallBack x, int y);  
  3.  [DllImport("user32.dll")]private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);  
  4.  [DllImport("user32.dll")]private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount); 

2 調(diào)用EnumWindows遍歷窗口

  1.  CallBack myCallBack = new CallBack(Recall);  
  2.  EnumWindows(myCallBack, 0); 

3 回調(diào)方法Recall

  1.  public bool Recall(int hwnd, int lParam)  
  2.  {  
  3.   StringBuilder sb = new StringBuilder(256);  
  4.   IntPtr PW = new IntPtr(hwnd);  
  5.  
  6.   GetWindowTextW(PW,sb,sb.Capacity); //得到窗口名并保存在strName中  
  7.   string strName = sb.ToString();  
  8.  
  9.   GetClassNameW(PW,sb,sb.Capacity); //得到窗口類(lèi)名并保存在strClass中  
  10.   string strClass = sb.ToString();  
  11.  
  12.   if (strName.IndexOf("窗口名關(guān)鍵字") >= 0 && strClass.IndexOf("類(lèi)名關(guān)鍵字") >= 0)  
  13.   {  
  14.    return false//返回false中止EnumWindows遍歷  
  15.   }  
  16.   else 
  17.   {  
  18.    return true//返回true繼續(xù)EnumWindows遍歷  
  19.   }  
  20.  } 

3)、打開(kāi)窗口得到句柄

1 定義設(shè)置活動(dòng)窗口API(SetActiveWindow),設(shè)置前臺(tái)窗口API(SetForegroundWindow)

  1.  [DllImport("user32.dll")]static extern IntPtr SetActiveWindow(IntPtr hWnd);  
  2.  [DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool SetForegroundWindow(IntPtr hWnd); 

2 打開(kāi)窗口

  1.  Process proc = Process.Start(@"目標(biāo)程序路徑");  
  2.  SetActiveWindow(proc.MainWindowHandle);  
  3.  SetForegroundWindow(proc.MainWindowHandle); 

三、向指定的窗口輸入數(shù)據(jù)

1 利用發(fā)送消息API(SendMessage)向窗口發(fā)送數(shù)據(jù) 

  1. InputStr(myIntPtr, _GameID); //輸入游戲ID  
  2.  SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X09, 0); //輸入TAB(0x09)  
  3.  SendMessage(myIntPtr, WM_SYSKEYUP, 0X09, 0);  
  4.  InputStr(myIntPtr, _GamePass); //輸入游戲密碼  
  5.  SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X0D, 0); //輸入ENTER(0x0d)  
  6.  SendMessage(myIntPtr, WM_SYSKEYUP, 0X0D, 0);  
  7.  
  8.  /// < summary>  
  9.  /// 發(fā)送一個(gè)字符串  
  10.  /// < /summary>  
  11.  /// < param name="myIntPtr">窗口句柄< /param>  
  12.  /// < param name="Input">字符串< /param>  
  13.  public void InputStr(IntPtr myIntPtr, string Input)  
  14.  {  
  15.   byte[] ch = (ASCIIEncoding.ASCII.GetBytes(Input));  
  16.   for (int i = 0; i <  ch.Length; i++)  
  17.   {   
  18.    SendMessage(PW, WM_CHAR, ch, 0);  
  19.   }  
  20.  }  
  21.  

2 利用鼠標(biāo)和鍵盤(pán)模擬向窗口發(fā)送數(shù)據(jù)

  1.  SetWindowPos(PW, (IntPtr)(-1), 0, 0, 0, 0, 0x0040 | 0x0001); //設(shè)置窗口位置  
  2.  SetCursorPos(476, 177); //設(shè)置鼠標(biāo)位置  
  3.  mouse_event(0x0002, 0, 0, 0, 0); //模擬鼠標(biāo)按下操作  
  4.  mouse_event(0x0004, 0, 0, 0, 0); //模擬鼠標(biāo)放開(kāi)操作  
  5.  SendKeys.Send(_GameID);   //模擬鍵盤(pán)輸入游戲ID  
  6.  SendKeys.Send("{TAB}"); //模擬鍵盤(pán)輸入TAB  
  7.  SendKeys.Send(_GamePass); //模擬鍵盤(pán)輸入游戲密碼  
  8.  SendKeys.Send("{ENTER}"); //模擬鍵盤(pán)輸入ENTER 

另:上面還提到了keybd_event方法,用法和mouse_event方法類(lèi)似,作用和SendKeys.Send一樣。

這樣,就實(shí)現(xiàn)了C#調(diào)用Windows API自動(dòng)登錄。

【編輯推薦】

  1. 四種C#參數(shù)類(lèi)型簡(jiǎn)介
  2. Java與C#的不同之處
  3. 學(xué)習(xí)C#程序集
  4. C#和ADO.NET建立數(shù)據(jù)綁定網(wǎng)格
  5. 介紹C# 4.0新特性dynamic
責(zé)任編輯:book05 來(lái)源: csdn
相關(guān)推薦

2009-08-03 13:34:57

C#調(diào)用Windows

2009-07-31 16:12:10

Windows APIC#

2009-08-17 13:18:01

C#調(diào)用Windows

2009-08-17 13:49:20

C#中調(diào)用Window

2009-08-17 13:26:20

C#調(diào)用Windows

2009-08-07 16:10:20

C#調(diào)用API

2009-08-05 15:10:19

C#調(diào)用GoogleE

2009-08-03 13:13:52

C#調(diào)用Outlook

2009-08-07 16:43:44

C#調(diào)用Windows

2009-08-03 14:09:15

C#調(diào)用API

2009-08-21 17:42:36

C#調(diào)用API

2009-08-07 17:01:22

C#調(diào)用QuickTe

2009-07-31 15:47:20

Win32 APIC#

2009-08-17 17:08:35

C# ADSL自動(dòng)撥號(hào)

2012-05-31 13:59:43

PHP

2009-08-11 14:16:00

Winform調(diào)用WEC#

2009-09-03 16:20:14

C#調(diào)用Windows

2024-05-16 12:33:37

C#編程指針

2009-08-21 11:24:16

C#異步調(diào)用

2009-08-17 16:18:47

C#調(diào)用CreateO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)