การส่งค่าเพื่อควบคุมโปรแกรมตามเราต้องการ
สมมติว่าต้องการคำนวนค่าตัวเลขใน โปรแกรม Calculator ซึ่งจะมีวิธีการ
สองวิธีคือ
1. เปิดโปรแกรม Calculator ขึ้นมาแล้วก็กดปุ่มตัวเลขต่างๆ เอง
2. เขียนโปรแกรมสั่งให้โปรแกรมควบคุม Calculator อีกทีโดยที่เราไม่ต้อง
กดปุ่มตัวเลขบน โปรแกรม Calculator เราแค่สร้าง form ขึ้นมาแล้วมีปุ่ม
Button แค่ปุ่มเดี่ยวเพื่อสำหรับเปิดปิดโปรแกรม Calculator และสั่งให้ประมวลผลการ
บวกค่าเพื่อให้ได้ผลลัพธ์ที่ต้องการ
วิธีการ
ถ้าเป็นการสั่งให้เปิด โปรแกรม Calculator ขึ้นมาก็จะใช้คำสั่งของคลาส
Process เพื่อเปิด โปรแกรม
และจะใช้ Sendkey เพื่อเป็นการส่งค่าเข้าไปในโปรแกรมดังนี้
1. สร้าง Window Form ขึ้นมา และลากปุ่ม button มาวาง 1 ปุ่มดับเบิล
คลิกที่ปุ่มแล้วเขียนโค้ดดังนี้
Process p = Process.Start("calc.exe");
จะต้องมีการเรียกใช้ using System.Diagnostics; ด้วย
2. ถ้าขั้นตอนที่ 1 ถ้าเราสั่งให้รันดูแล้วคลิกปุ่มจะเห็นว่าสามารถที่จะสั่งให้โปรแกรม
Calulator เปิดการทำงานได้ แต่เราต้องการสั่งให้โปรแกรมสามารถคำนวนผลได้ก็ให้เขียนโค้ดดังนี้
สิ่งแรกจะต้องสร้าง เมธอด FindWindow,SetForegroundWindow ก่อนตามโค้ดดังนี้
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string classname, string windowname);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr p);
3. จากนั้นใน event button1_click ก็เขียนคำสั่งเพื่อเรียกใช้เมธอด Findwindow,SetForegroundWindow
ดังนี้
***ชื่อ classname,windowname ดูได้จาก SPY++ (ดูวิธีการใช้งานตรงได้ที่นี่ http://www.codetoday.net/yaf_postst1136_-SPY.aspx )
Process p = Process.Start("calc.exe");
Thread.Sleep(1000);//รอเวลา ก่อนที่จะสั่งโปรแกรม CalCulator ทำงาน
IntPtr open_calculator = FindWindow("SciCalc", "Calculator Plus");
if (open_calculator == IntPtr.Zero)
{
MessageBox.Show("This window cannot open");
return;
}
else
{
SetForegroundWindow(open_calculator); //set Calculator ให้เป็น window หลักในการรับค่า
SendKeys.SendWait("3");//ส่งค่าไปที่ โปรแกรม Calculator
SendKeys.SendWait("*");
SendKeys.SendWait("5");
SendKeys.SendWait("=");
}
ผลลัพธ์จะได้ดังรูป

ตัวอย่างโค้ดทั้งหมด
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Process p = Process.Start("calc.exe");
Thread.Sleep(1000);//รอเวลา ก่อนที่จะสั่งโปรแกรม CalCulator ทำงาน
IntPtr open_calculator = FindWindow("SciCalc", "Calculator Plus");
if (open_calculator == IntPtr.Zero)
{
MessageBox.Show("This window cannot open");
return;
}
else
{
SetForegroundWindow(open_calculator); //set Calculator ให้เป็น window หลักในการรับค่า
SendKeys.SendWait("3");//ส่งค่าไปที่ โปรแกรม Calculator
SendKeys.SendWait("*");
SendKeys.SendWait("5");
SendKeys.SendWait("=");
}
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string classname, string windowname);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr p);
}
}
[With great power comes great responsibility]