Tag: sendmessage

使用C#/ Win32将文本写入记事本

我正在搞乱Win32 API和Windows消息传递,试图找出工作原理,我发现这个问题非常有用 。 我想改进那里提供的解决方案,以便它附加文本,而不是仅通过WM_SETTEXT替换记事本中的文本。 我的问题是,如何使用WM_GETTEXTLENGHT,然后使用WM_GETTEXT来获取记事本窗口中的当前文本,以便在使用WM_SETTEXT之前我可以在其中添加新文本? 使用WM_XXXTEXT是否适用于32位和64位计算机? 如果记事本中有很多文本,那么建议的get / set算法是否仍然有用,或者它会占用大量资源? 如果是这样,是否有另一种方法将文本附加到记事本窗口而不先复制其中的所有内容? 谢谢你的帮助!! 更新: 以下是我根据David Heffernan的帮助和Google / SO切割粘贴提出的代码。 由于我是Win32API的新手,并且从不同的来源复制了很多行,所以我很感激所有的反馈。 [DllImport(“User32.dll”, CharSet = CharSet.Auto)] extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName); [DllImport(“User32.dll”, EntryPoint = “SendMessage”)] extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport(“User32.dll”)] public static extern int SendMessage(IntPtr […]

将C ++字符串发送到C#字符串。 互操作

我是跨流程沟通的新手,需要一些帮助。 我希望能够将C ++程序中的字符串发送到C#程序。 我的问题是结果字符串是乱码。 这是我的代码: 发送程序(C ++): void transmitState(char* myStr) { HWND hWnd = ::FindWindow(NULL, _T(“myApp v.1.0”)); if (hWnd) { COPYDATASTRUCT cds; ::ZeroMemory(&cds, sizeof(COPYDATASTRUCT)); cds.dwData = 0; cds.lpData = (PVOID) myStr; cds.cbData = strlen(myStr) + 1; ::SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds); } } 接收程序(C#)(我已经覆盖了WndProc): private void OnCopyData(ref Message m) { COPYDATASTRUCT cds = new COPYDATASTRUCT(); cds […]

是否可以发送WM_COPY消息,复制除剪贴板以外的其他地方的文本?

这是方法定义: [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr lparam, IntPtr wparam); 这是对SendMessage的调用: //WM_COPY = 0x0301 SendMessage(handle, WM_COPY, IntPtr.Zero, IntPtr.Zero); 这是我检索数据的方式: string text = System.Windows.Forms.Clipboard.GetText(); 除了我不想将数据复制到剪贴板之外,我想做同样的事情。 是否可以将数据复制到内存中的其他部分? 如果是这样,怎么样?

不能在我的c#程序中使用SendMessage_EX两次

我面临一个非常奇怪的问题,无法弄清楚错误在哪里。 我正在使用SendMessage_EX来获取指定行的文本: SendMessage_Ex(hr.Handle, EM_GETLINE, l, buffer); 然后我这样调用两次方法: StringBuilder buffer = new StringBuilder(256); SendMessage_Ex(hr.Handle, EM_GETLINE, 5, buffer); StringBuilder buffer1 = new StringBuilder(256); SendMessage_Ex(hr.Handle, EM_GETLINE, 4, buffer1); 它正确获取第5行的文本,然后第4行,它返回任何内容(buffer1为空)。 如果我将其反转并首先获得第4行然后第5行,则返回第4行的文本,第5行则不返回任何内容。 这很奇怪,我确定我犯了一个简单的错误,但错误在哪里? 我感谢任何帮助。 🙂

SendMessage,何时使用KEYDOWN,SYSKEYDOWN等?

我正在编写一个应用程序,使用SendMessage将键击发送到另一个应用程序。 [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); 我一直在尝试各种参数,我注意到,根据我发送的键击,我必须将不同的参数传递给参数int Msg 。 例如,我将以下定义为Msg可能值。 private static ushort WM_SYSKEYDOWN = 0x0104; private static ushort WM_CHAR = 0x0102; private static ushort WM_KEYDOWN = 0x0100; 以及传递给第3个参数wParam的以下测试键: private static ushort VK_F1 = 0x70; private static ushort VK_A = 0x41; private static ushort VK_TAB = 0x09; […]

C#和SendMessage(键)无法正常工作

我试图将密钥发送到应用程序。 为了方便测试,我只使用了记事本。 这就是代码的样子: [DllImport(“USER32.DLL”, EntryPoint = “SendMessageW”, SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam); const int WM_KEYDOWN = 0x100; const int WM_a = 0x41; public void Press() { Process[] p = Process.GetProcessesByName(“notepad”); IntPtr pHandle = p[0].MainWindowHandle; SendMessage(pHandle, WM_KEYDOWN, […]

使用SendMessage的C#,WM_COPYDATA的问题

我已经花了几天(或更多)试图让这个工作。 手头的应用程序是FTPRush ,我知道有一个名为rush_cmdline.exe的cmd行应用程序,它使用SendMessage向FTPRush发送请求。 从调试rush_cmdline.exe我可以看到lParam , wParam , Message和hWnd 。 我的代码如下(使用SendMessage,而不是SendMessageW): [DllImport(“User32.dll”, EntryPoint = “FindWindow”)] public static extern Int32 FindWindow(String lpClassName, String lpWindowName); [DllImport(“USER32.DLL”, EntryPoint= “SendMessage”)] public static extern IntPtr SendMessage(int hWnd, int Msg, int wParam, IntPtr lParam); 我还尝试了另一个规范: [DllImport(“User32.dll”, EntryPoint = “SendMessage”)] public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam); […]

使用C#从任何窗口捕获突出显示的文本

如何使用c#从任何窗口中读取突出显示/选定的文本。 我试过两种方法。 每当用户选择一些东西时发送“^ c”。 但在这种情况下,我的剪贴板充斥着大量不必要的数据。 有时它也会复制密码。 所以我把我的方法改为第二种方法,发送消息方法。 请参阅此示例代码 [DllImport(“user32.dll”)] static extern int GetFocus(); [DllImport(“user32.dll”)] static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); [DllImport(“kernel32.dll”)] static extern uint GetCurrentThreadId(); [DllImport(“user32.dll”)] static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId); [DllImport(“user32.dll”) ] static extern int GetForegroundWindow(); [DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = false)] static extern int SendMessage(int hWnd, int […]

使用User32.dll SendMessage使用ALT修改器发送密钥

可能重复: C#和SendMessage(键)无法正常工作 我正在编写一个应用程序,使用user32.dll中定义的SendMessage函数将键击发送到另一个应用程序。 我已经弄清楚如何发送一个击键但我很难过尝试发送击键和ALT键。 出于我的问题的目的,我将专注于发送F1和ALT + F1。 如上所述,我能够发送F1键没问题。 这是我的代码片段,它发送F1键: // DLL Imports //Set the active window [DllImport(“user32.dll”)] public static extern IntPtr SetActiveWindow(IntPtr hWnd); //sends a windows message to the specified window [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam); // … // Some constants #define WM_SYSKEYDOWN 260 #define WM_SYSKEYUP 261 […]

从另一个应用程序获取文本

我想在另一个应用程序中从文本框中检索文本。 第二个应用程序的ProcessName是’TestTextBox’,TextBox的名称是’textBox1’。 我的代码,返回空字符串: [DllImport(“user32.dll”)] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, long wParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam); Process[] processes = Process.GetProcessesByName(“TestTextBox”); foreach (Process p in processes) { IntPtr pFoundWindow = p.MainWindowHandle; const int WM_GETTEXT = 0x0D; StringBuilder sb = new StringBuilder(); IntPtr retVal = SendMessage(pFoundWindow, WM_GETTEXT, 100, sb); MessageBox.Show(sb.ToString()); }