C# 如何用獲取文本框的句柄,並且獲取文本框里面的值?
C# 如何用獲取某個應用程序里面的文本框的句柄,並且獲取文本框里面的值?
我是要拿到那個程序里面文本框的句柄.
IntPtr ab = new IntPtr();
StringBuilder className = new StringBuilder(256);
IntPtr ip = User32API.FindWindow("Notepad", "Raybelly.txt - 記事本");
IntPtr b = User32API.FindWindowEx(ip, ab, "Edit", null);
User32API.GetWindowText(b, className, className.Capacity);
MessageBox.Show(className.ToString());
我現在已經拿到文本框的句柄了,但是GetWindowText方法拿不出里面的值?
const int HWND_TOPMOST = -1;
const int SWP_SHOWWINDOW = 40;
const int WM_GETTEXT = 0x000D;
private void Form1_Load(object sender, System.EventArgs e)
{
IntPtr ab = new IntPtr();
StringBuilder className = new StringBuilder(256);
IntPtr ip = User32API.FindWindow("Notepad", "Raybelly.txt - 記事本");
IntPtr b = User32API.FindWindowEx(ip, ab, "Edit", null);
//User32API.GetWindowText(b, className, className.Capacity);
//MessageBox.Show(className.ToString());
string w = "";
IntPtr ptr = Marshal.StringToHGlobalAnsi(w);
if (User32API.SendMessage(b, WM_GETTEXT, 100000, ptr))
MessageBox.Show(Marshal.PtrToStringAnsi(ptr));
}
const int HWND_TOPMOST = -1;
const int SWP_SHOWWINDOW = 40;
const int WM_GETTEXT = 0x000D;
private void Form1_Load(object sender, System.EventArgs e)
{
IntPtr ab = new IntPtr();
StringBuilder className = new StringBuilder(256);
IntPtr ip = User32API.FindWindow("Notepad", "Raybelly.txt - 記事本");
IntPtr b = User32API.FindWindowEx(ip, ab, "Edit", null);
//User32API.GetWindowText(b, className, className.Capacity);
//MessageBox.Show(className.ToString());
string w = "";
IntPtr ptr = Marshal.StringToHGlobalAnsi(w);
if (User32API.SendMessage(b, WM_GETTEXT, 100000, ptr))
MessageBox.Show(Marshal.PtrToStringAnsi(ptr));
}
參照以上資材(網上下載的)編寫了我自己的程序,運行過程中發現功能沒有問題,但是經常死機,卡死。
應該反復尋找,找到了額問題點的所在
string w="" ; 申請的是空字符串,而 if (User32API.SendMessage(b, WM_GETTEXT, 100000, ptr)) 使用了100000個字符串。
運行一次兩次沒有問題,如果經常使用 會出現 卡死,死機的問題發生
解決辦法 string w="" ; 變更為 string w=new string(new char[100000]);
這樣就解決問題了
句柄太消耗CPU資源了
以下是我優化后直接使用StringBuilder 來接收數據
using System.Runtime.InteropServices;
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern void SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
// rfptr為主菜單的句柄
rfptr = FindWindow(null, "要尋找的標題名稱");
//child_2為文本框的 句柄
child_2 = FindWindowEx(rfptr, child_two, "要尋找的類名稱");
StringBuilder strbu = new StringBuilder(102);
SendMessage(child_2, 0x0d, 100, strbu);
//label1.text輸出找到的文檔
label1.text=strbu.tostring();
面是轉載自:http://www.cnblogs.com/me-sa/articles/669402.html
SendMessage是一個在user32.dll中聲明的API函數,在C#中導入如下:
using System.Runtime.InteropServices;[DllImport("user32.dll", EntryPoint="SendMessageA")]public static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
本文描述其參數 lParam 的用法,主要是數據類型之間的轉化。
● 一種最簡單的處理方式是聲明多個SendMessage函數(overload),用所需的數據類型直接替換IntPtr。例如:
//聲明:[DllImport("user32.dll", EntryPoint="SendMessageA")]private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);[DllImport("user32.dll", EntryPoint="SendMessageA")]private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);//調用:string s = "hello, floodzhu";SendMessage(this.textBox1.Handle, WM_SETTEXT, IntPtr.Zero, s);Rectangle rect = new Rectangle();SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, ref rect);
● 對要求返回字符串的類型(out string)可以用 StringBuilder 代替,此時不需要 out/ref。例如:
[DllImport("user32.dll", EntryPoint="SendMessageA")]private static extern int SendMessage (IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);private void button1_Click(object sender, System.EventArgs e){ const int buffer_size = 1024; StringBuilder buffer = new StringBuilder(buffer_size); SendMessage(this.textBox1.Handle, WM_GETTEXT, buffer_size, buffer); //MessageBox.Show(buffer.ToString());}
● 如果想用 InPtr 類型統一處理的話,可以借助於 Marshal 或者 GCHandle 的相關方法。例如:
[DllImport("user32.dll", EntryPoint="SendMessageA")]private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);private void button2_Click(object sender, System.EventArgs e){ Rectangle rect = new Rectangle(); IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Rectangle))); Marshal.StructureToPtr(rect, buffer ,true); SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, buffer); rect = (Rectangle)Marshal.PtrToStructure(buffer, typeof(Rectangle)); Marshal.FreeHGlobal(buffer);}
或者
private void button2_Click(object sender, System.EventArgs e){ Rectangle rect = new Rectangle(); GCHandle gch = GCHandle.Alloc(rect); SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, (IntPtr)gch); rect = (Rectangle)Marshal.PtrToStructure((IntPtr)gch, typeof(Rectangle)); gch.Free();}