C#和部分工作的SendMessage?

时间:2012-10-01 17:59:29

标签: c# .net windows winapi

我尝试将短信发送到Windows 7中的各种应用程序(例如Notepad ++,Notepad等)。 SendMessage适用于Notepad,但不适用于Notepad ++。

如果我正在向记事本发送文本,一切都显得很好,全文,我从SendMessage方法返回1。但是对于Notepad ++,只显示第一个字母,方法SendMessage返回0,但是Marshal.GetLastWin32Error()没有返回任何错误(结果为0)?

以下是代码:

GUITHREADINFO gti = new GUITHREADINFO();
IntPtr hWnd = GetForegroundWindow();
uint processId;
uint activeThreadId = GetWindowThreadProcessId(hWnd, out processId);
if (GetInfo(activeThreadId, out gti))
{
    int EM_REPLACESEL = 0x00C2;

    int error = Marshal.GetLastWin32Error();
    int result = SendMessageW(gti.hwndCaret, EM_REPLACESEL, -1, passed);//3rd param doesn't change anything
    error = Marshal.GetLastWin32Error();
}

WinAPI函数和GetInfo方法只要具有所需的结构,就定义为:

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

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
//"Borrowed" code
public static bool GetInfo(uint hwnd, out GUITHREADINFO lpgui)
{
     uint lpdwProcessId;
     uint threadId = GetWindowThreadProcessId(hwnd, out lpdwProcessId);

     lpgui = new GUITHREADINFO();
     lpgui.cbSize = Marshal.SizeOf(lpgui);

    return GetGUIThreadInfo(threadId, ref lpgui);
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int iLeft;
    public int iTop;
    public int iRight;
    public int iBottom;
}

[StructLayout(LayoutKind.Sequential)]
public struct GUITHREADINFO
{
    public int cbSize;
    public int flags;
    public IntPtr hwndActive;
    public IntPtr hwndFocus;
    public IntPtr hwndCapture;
    public IntPtr hwndMenuOwner;
    public IntPtr hwndMoveSize;
    public IntPtr hwndCaret;
    public RECT rectCaret;
}

所以我想知道我应该怎么做才能修复它所以它可以(完全)为所有窗口工作,不仅仅是在记事本中进行编辑控制?

0 个答案:

没有答案