2016-09-28 124 views
-2

我已經看過了這個問題,並回答C#我無法得到SendMessage函數將消息發送到記事本窗口

How to send text to Notepad in C#/Win32?

細微變化,我認爲不應該的問題..是不是我有一堆記事本窗口..所以爲了測試這個,我將notepad.exe複製到了notepadd.exe並打開了notepadd.exe,因此我的記事本窗口中只有一個是notepadd.exe進程。

我有這樣的代碼

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace testsendmessage 
{ 

    public partial class Form1 : Form 
    { 
     [DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Process[] notepads = Process.GetProcessesByName("notepadd"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null); 
       SendMessage(child, 0x000C, 0, "abcd"); 
      } 
     } 
    } 
} 

它不觸及雖然記事本窗口。

我試着調試,我看到記事本數組有一個項目,這當然是正確的。

而且它內的「如果」得到它運行SendMessage(child, 0x000C, 0, "abcd");

但我什麼也看不到出現在記事本窗口

我並不是它只是沒有在記事本中出現的代碼得到一個錯誤窗口..我真的不太瞭解winapi的東西,所以我不知道如何着手解決它呢?

正如你可以看到它到達那行,我可以使用監視窗口來看看記事本處理陣列,並在「孩子」,但我不知道我應該看什麼,以確定爲什麼它不發送到窗口

enter image description here

新增

基於對雷米的建議

新代碼

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace testsendmessage 
{ 

    public partial class Form1 : Form 
    { 
     [DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

     [DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "SendMessageW")] 
     public static extern IntPtr SendMessageWStr(IntPtr hWnd, uint uMsg, IntPtr wParam, string lParam); 

     const uint WM_SETTEXT = 0x000C; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Process[] notepads = Process.GetProcessesByName("notepadd"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null); 
       SendMessageWStr(child, WM_SETTEXT, IntPtr.Zero, "abcd"); 
      } 

     } 
    } 
} 

但我仍然遇到同樣的問題,記事本窗口在單擊按鈕之前是空白的,而且在之後也是空白的。它不會將文本發送到記事本窗口。儘管它正在到達要發送文本的那一行代碼。

進一步增加。

當前代碼,

我已經改變了FindWindowEx來FindWindowExW,我已經改變了新的IntPtr(0)至IntPtr.Zero,它仍然是反應遲鈍。

我打開了從cmd notepadd.exe,我看到那裏的窗口。當然,在任務管理器中notepadd.exe,但點擊我的應用程序中的按鈕不寫入任何文本到該窗口。

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace testsendmessage 
{ 

    public partial class Form1 : Form 
    { 
     [DllImport("user32.dll", EntryPoint = "FindWindowExW")] 

     public static extern IntPtr FindWindowExW(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

     [DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "SendMessageW")] 
     public static extern IntPtr SendMessageWStr(IntPtr hWnd, uint uMsg, IntPtr wParam, string lParam); 

     const uint WM_SETTEXT = 0x000C; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Process[] notepads = Process.GetProcessesByName("notepadd"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       IntPtr child = FindWindowExW(notepads[0].MainWindowHandle, IntPtr.Zero, "Edit", null); 
       SendMessageWStr(child, WM_SETTEXT, IntPtr.Zero, "abcd"); 
      } 

     } 
    } 
} 
+0

SendMessage()'的返回值是什麼?如[記錄](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632644.aspx):「*如果設置了文本,則返回值爲TRUE,它爲'FALSE' (如果是編輯控件),如果沒有足夠的空間來設置編輯控件中的文本,則使用「LB_ERRSPACE」(對於列表框)或「CB_ERRSPACE」(對於組合框);如果此消息爲「CB_ERR」發送到一個組合框沒有編輯控制。*「 –

+0

@RemyLebeau我現在希望是一個調整,使我的代碼進入一個工作演示..我對winapi知之甚少,PInvoke ,MarshalAs等。 – barlop

+0

嘗試更像這樣的:'const uint WM_SETTEXT = 0x000C; [DllImport(「User32.dll」,CharSet = CharSet.Unicode,EntryPoint =「SendMessageW」)] public static extern IntPtr SendMessageWStr(IntPtr hWnd,uint uMsg,IntPtr wParam,string lParam);'然後你可以使用'SendMessageWStr child,WM_SETTEXT,IntPtr.Zero,「abcd」);' –

回答

0

給雷米很多功勞。經過一些故障排除後,我終於找到了代碼,所以這是一個神祕的原因,我發現它沒有。

一個很好的故障排除步驟是嘗試用nircmd移動窗口,讓您知道您有句柄。

爲了得到窗口的句柄,您可以使用nirsoft winlister,或winspector

可以使用的NirCmd命令,如nircmd win close handle 0x00230632變化是0x00230632,無論你找到手感是。或者最好不要關閉它(否則你將不得不重新打開它,並且新窗口將會有一個新的句柄),所以像nircmd win move handle 0x00B917AE 80 10 100 100這樣的命令所以你知道句柄是正確的,不管代碼有什麼問題。

Winspector還顯示記事本窗口的子

enter image description here

讓我們再回到C#代碼,你可以

跳過孩子,並嘗試寫入到家長,應該寫進窗口標題

嘗試使用SendMessage直接指定一個窗口。你用十進制而不是十六進制編寫句柄。例如如果句柄是3479948,則

例如, SendMessage(new IntPtr(3479948), WM_SETTEXT, IntPtr.Zero, "abcdee");

您還可以檢查記事本[0] .MainWindowHandle正在拾取正確的值.. winspector中顯示的句柄。

你可以看看IntPtr child = FindWindowEx(...)行,確保'孩子'正在拿起孩子的手柄。

您可以嘗試直接使用SendMessage寫入該消息。例如SendMessage(new IntPtr(1234567), WM_SETTEXT, IntPtr.Zero, "abcdee"); //(如果winspector將子窗口顯示爲該句柄)。