Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 20 kết quả

Đề tài: Sử dụng hàm API Sendmessage để gửi phím bấm tới notepad trong C#?

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    6

    Mặc định Sử dụng hàm API Sendmessage để gửi phím bấm tới notepad trong C#?

    Hi all,

    Mình đang cần gửi một phím bấm ( thật ra là nhấn 1 nút trên một process đang chạy và minimize ). Mính làm thử với notepad, phần FindWindow thì ok rồi, nhưng sao lệnh sendmessage không hoạt động.
    AI rành hướng dẫn giùm với nhé.


    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);


    private void btnGetProcess_Click(object sender, EventArgs e)
    {
    IntPtr hwnd = FindWindow(null, "1.txt - Notepad");
    SendMessage(hwnd, 0x100, 0x74, 0);

    }

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    9

    Xin lỗi vì câu hỏi này đã lâu ... nhưng vấn đề này mình cũng đang tìm hiểu .... ai biết thì giúp mình với ....

  3. #3
    Ngày gia nhập
    05 2010
    Bài viết
    345

    Bạn vào xem link này

    http://stackoverflow.com/questions/4665463/button-click-in-sendmessage-api

    Bạn lưu ý lấy handle của nút, hoặc bạn có thể thay đổi trạng thái cửa sổ bằng hàm showwindow.

  4. #4
    Ngày gia nhập
    03 2009
    Bài viết
    128

    Bạn cần tìm cái handle của cái textbox bên trong cửa sổ chứ không phải handle của của sổ notepad

  5. #5
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    Trích dẫn Nguyên bản được gửi bởi hoanghiep9x Xem bài viết
    Xin lỗi vì câu hỏi này đã lâu ... nhưng vấn đề này mình cũng đang tìm hiểu .... ai biết thì giúp mình với ....
    Bạn đó mới chỉ tìm thấy handle của cửa sổ NotePad chứ chưa tìm được handle của cửa sổ soạn thảo trong NotePad, cửa sổ soạn thảo này có class name là "Edit", đây là một cửa sổ con cấp 1 của cửa sổ NotePad, để lấy handle của cửa sổ này ta dùng hàm FindWindowEx() sau đó gửi thông điệp 0x0102 (là WM_CHAR, chứ không phải 0x100 như bạn kia đã làm). Cụ thể như thế này nhé:

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. using System.Runtime.InteropServices;
    10.  
    11. namespace WindowsFormsApplication1
    12. {
    13.     public partial class Form1 : Form
    14.     {
    15.         [DllImport("user32.dll", SetLastError = true)]
    16.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    17.  
    18.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    19.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    20.         [DllImport("user32.dll", SetLastError = true)]
    21.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    22.        
    23.         public Form1()
    24.         {
    25.             InitializeComponent();
    26.         }
    27.  
    28.        
    29.         private void button1_Click(object sender, EventArgs e)
    30.         {
    31.             IntPtr hwnd1 = FindWindow("Notepad", "Untitled - Notepad");
    32.             IntPtr hwnd2 = FindWindowEx(hwnd1,IntPtr.Zero ,"Edit","");
    33.             IntPtr send= SendMessage(hwnd2, 0x0102, 0x74, 0);
    34.         }
    35.     }
    36. }
    A good beginning and a good ending !

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    9

    Mặc định Sử dụng hàm API Sendmessage để gửi phím bấm tới notepad trong C#?

    Cảm ơn các bạn nhiều nha ...đặc biệt là bạn Moscow ^^

  7. #7
    Ngày gia nhập
    05 2011
    Bài viết
    11

    Bạn Moscow thân mến, mình cũng đang học mới về API, và có copy code của bạn để chạy thử. Tuy nhiên mình không thấy nó hiện ra gì cả, chỉ có mỗi winform và không thấy của sổ Notepad hiện ra. Việc mình làm duy nhất là thay đổi tên Form thành tên dễ nhớ của mình, liệu nó có ảnh hưởng gì đến code không bạn. Và nếu không thì bạn có thể giải thích hộ mình tại sao chương trình lại không chạy không vậy Cảm ơn bạn nhiều nhé

  8. #8
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    - Để xem NotePad có nhận được không thì bạn phải mở cửa số đó lên đã, sau đó nhấn Button1 và quan sát bạn nhé. Code của mình không phải là khởi động NotePad và send ký tự "t" vào cửa sổ đó. Nếu bạn muốn khởi động NotePad trước bằng code thì bạn hãy dùng lệnh sau trong sự kiện Load của Form:
    Visual C# Code:
    1. System.Diagnostics.Process.Start("NotePad.exe");

    Code cụ thể như sau:

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Text;
    7. using System.Windows.Forms;
    8. using System.Runtime.InteropServices;  // Dùng để khai báo APIs
    9. namespace WindowsFormsApplication2
    10. {
    11.     public partial class Form1 : Form
    12.     {
    13.         [DllImport("user32.dll", SetLastError = true)]
    14.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    15.  
    16.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    17.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    18.         [DllImport("user32.dll", SetLastError = true)]
    19.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    20.  
    21.         public Form1()
    22.         {
    23.             InitializeComponent();
    24.         }
    25.  
    26.         private void Form1_Load(object sender, EventArgs e)
    27.         {
    28.             System.Diagnostics.Process.Start("NotePad.exe");
    29.         }
    30.  
    31.         private void button1_Click(object sender, EventArgs e)
    32.         {
    33.             IntPtr hwnd1 = FindWindow("Notepad", "Untitled - Notepad");
    34.             IntPtr hwnd2 = FindWindowEx(hwnd1, IntPtr.Zero, "Edit", "");
    35.             IntPtr send = SendMessage(hwnd2, 0x0102, 0x74, 0);
    36.         }
    37.     }
    38. }

    Lúc này lệnh kia sẽ khởi động NotePad cho bạn (dĩ nhiên như thế bạn không cần phải mở trước cửa sổ này), điểm chú ý là nếu có từ 2 trở lên số cửa sổ NotePad hiện lên (các instances) thì nó sẽ chấp nhận instance được active gần nhất.

    - Nếu bạn thay đổi tên Form thì bạn chỉ cần copy vào các vị trí tương ứng trên cửa sổ code của Form đó, cụ thể là:
    + Khai báo dòng sau trên mục using:
    Visual C# Code:
    1. using System.Runtime.InteropServices;  // Dùng để khai báo APIs
    + Có thể đặt các khai báo sau trước hàm tạo của Form:
    Visual C# Code:
    1. [DllImport("user32.dll", SetLastError = true)]
    2.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    3.  
    4.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    5.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    6.         [DllImport("user32.dll", SetLastError = true)]
    7.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    + Và cuối cùng là đặt các code trong Button1_Click(...) vào vị trí mà bạn muốn tương tác.
    + Nếu muốn khởi động NotePad thì bạn đặt dòng sau vào bất cứ chỗ nào mà tại đó bạn muốn khởi động:

    Visual C# Code:
    1. System.Diagnostics.Process.Start("NotePad.exe");

    Có gì bạn cứ trao đổi, mình sẽ giải đáp trong phạm vi hiểu biết của mình.
    A good beginning and a good ending !

  9. #9
    Ngày gia nhập
    05 2011
    Bài viết
    11

    Mình cảm ơn bạn nhiều lắm MÌnh sẽ làm thử luôn bây giờ

  10. #10
    Ngày gia nhập
    11 2010
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    Bạn đó mới chỉ tìm thấy handle của cửa sổ NotePad chứ chưa tìm được handle của cửa sổ soạn thảo trong NotePad, cửa sổ soạn thảo này có class name là "Edit", đây là một cửa sổ con cấp 1 của cửa sổ NotePad, để lấy handle của cửa sổ này ta dùng hàm FindWindowEx() sau đó gửi thông điệp 0x0102 (là WM_CHAR, chứ không phải 0x100 như bạn kia đã làm). Cụ thể như thế này nhé:

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. using System.Runtime.InteropServices;
    10.  
    11. namespace WindowsFormsApplication1
    12. {
    13.     public partial class Form1 : Form
    14.     {
    15.         [DllImport("user32.dll", SetLastError = true)]
    16.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    17.  
    18.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    19.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    20.         [DllImport("user32.dll", SetLastError = true)]
    21.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    22.        
    23.         public Form1()
    24.         {
    25.             InitializeComponent();
    26.         }
    27.  
    28.        
    29.         private void button1_Click(object sender, EventArgs e)
    30.         {
    31.             IntPtr hwnd1 = FindWindow("Notepad", "Untitled - Notepad");
    32.             IntPtr hwnd2 = FindWindowEx(hwnd1,IntPtr.Zero ,"Edit","");
    33.             IntPtr send= SendMessage(hwnd2, 0x0102, 0x74, 0);
    34.         }
    35.     }
    36. }
    Trích dẫn Nguyên bản được gửi bởi rualammom Xem bài viết
    Bạn Moscow thân mến, mình cũng đang học mới về API, và có copy code của bạn để chạy thử. Tuy nhiên mình không thấy nó hiện ra gì cả, chỉ có mỗi winform và không thấy của sổ Notepad hiện ra. Việc mình làm duy nhất là thay đổi tên Form thành tên dễ nhớ của mình, liệu nó có ảnh hưởng gì đến code không bạn. Và nếu không thì bạn có thể giải thích hộ mình tại sao chương trình lại không chạy không vậy Cảm ơn bạn nhiều nhé
    Trích dẫn Nguyên bản được gửi bởi Moscow Xem bài viết
    - Để xem NotePad có nhận được không thì bạn phải mở cửa số đó lên đã, sau đó nhấn Button1 và quan sát bạn nhé. Code của mình không phải là khởi động NotePad và send ký tự "t" vào cửa sổ đó. Nếu bạn muốn khởi động NotePad trước bằng code thì bạn hãy dùng lệnh sau trong sự kiện Load của Form:
    Visual C# Code:
    1. System.Diagnostics.Process.Start("NotePad.exe");

    Code cụ thể như sau:

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Text;
    7. using System.Windows.Forms;
    8. using System.Runtime.InteropServices;  // Dùng để khai báo APIs
    9. namespace WindowsFormsApplication2
    10. {
    11.     public partial class Form1 : Form
    12.     {
    13.         [DllImport("user32.dll", SetLastError = true)]
    14.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    15.  
    16.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    17.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    18.         [DllImport("user32.dll", SetLastError = true)]
    19.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    20.  
    21.         public Form1()
    22.         {
    23.             InitializeComponent();
    24.         }
    25.  
    26.         private void Form1_Load(object sender, EventArgs e)
    27.         {
    28.             System.Diagnostics.Process.Start("NotePad.exe");
    29.         }
    30.  
    31.         private void button1_Click(object sender, EventArgs e)
    32.         {
    33.             IntPtr hwnd1 = FindWindow("Notepad", "Untitled - Notepad");
    34.             IntPtr hwnd2 = FindWindowEx(hwnd1, IntPtr.Zero, "Edit", "");
    35.             IntPtr send = SendMessage(hwnd2, 0x0102, 0x74, 0);
    36.         }
    37.     }
    38. }

    Lúc này lệnh kia sẽ khởi động NotePad cho bạn (dĩ nhiên như thế bạn không cần phải mở trước cửa sổ này), điểm chú ý là nếu có từ 2 trở lên số cửa sổ NotePad hiện lên (các instances) thì nó sẽ chấp nhận instance được active gần nhất.

    - Nếu bạn thay đổi tên Form thì bạn chỉ cần copy vào các vị trí tương ứng trên cửa sổ code của Form đó, cụ thể là:
    + Khai báo dòng sau trên mục using:
    Visual C# Code:
    1. using System.Runtime.InteropServices;  // Dùng để khai báo APIs
    + Có thể đặt các khai báo sau trước hàm tạo của Form:
    Visual C# Code:
    1. [DllImport("user32.dll", SetLastError = true)]
    2.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    3.  
    4.         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    5.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    6.         [DllImport("user32.dll", SetLastError = true)]
    7.         static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    + Và cuối cùng là đặt các code trong Button1_Click(...) vào vị trí mà bạn muốn tương tác.
    + Nếu muốn khởi động NotePad thì bạn đặt dòng sau vào bất cứ chỗ nào mà tại đó bạn muốn khởi động:

    Visual C# Code:
    1. System.Diagnostics.Process.Start("NotePad.exe");

    Có gì bạn cứ trao đổi, mình sẽ giải đáp trong phạm vi hiểu biết của mình.
    Bạn ơi cho mình hỏi 1 chút , 2 hàm findwindow và findwindowEX hoạt động như thế nào vậy, mình không hiểu đoạn :
    Visual C# Code:
    1. IntPtr hwnd1 = FindWindow("Notepad", "Untitled - Notepad");
    2. IntPtr hwnd2 = FindWindowEx(hwnd1, IntPtr.Zero, "Edit", "");

    Ví dụ mình muốn gửi nickname của mình vào khung id password của yahoo thì làm ntn ? Rất mong bạn giải đáp giúp mình , thanks

Các đề tài tương tự

  1. Cách tạo Run trong Notepad++
    Gửi bởi mvtt.uit91 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 13-06-2011, 07:42 PM
  2. Cách sử dụng SendMessage truyền tổ hợp phím vào Notepad?
    Gửi bởi thitgaluoc trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 04-06-2011, 08:31 PM
  3. SendMessage <<< Send chuỗi vào notepad !
    Gửi bởi Con Nít trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 14
    Bài viết cuối: 28-06-2010, 02:51 AM
  4. Vấn đề truyền vào tọa độ để mouse click trong SendMessage
    Gửi bởi supertmt trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 10-05-2010, 11:38 AM
  5. Chương trình notepad viết bằng C# | Làm sao open file trong notepad?
    Gửi bởi thanh_it trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 15-04-2009, 08:21 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn