C# using SendMessage, problem with WM_COPYDATA z

The final missing piece depends on if you are using any processor, x86 or
x64. The details using these different functions requires specific handling for
the structure. Essentially if you are using the any processor or x64 you may
have to use IntPtr or long, but for x86 you can use int for the dwData.


using System;
using System.Runtime.InteropServices;

namespace SendWindowMessage
{
class Program
{
const int WM_COPYDATA = 0x004A;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll",CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hwnd, int msg,IntPtr wparam, IntPtr lparam);
[DllImport("user32.dll", EntryPoint = "FindWindow")]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[StructLayout(LayoutKind.Sequential)]
struct COPYDATASTRUCT
{
public uint dwData;
public int cbData;
public IntPtr lpData;
}
public static IntPtr IntPtrAlloc<T>(T param)
{
IntPtr retval = Marshal.AllocHGlobal(Marshal.SizeOf(param));
Marshal.StructureToPtr(param, retval, false);
return (retval);
}

public static void IntPtrFree(IntPtr preAllocated)
{
if (IntPtr.Zero == preAllocated) throw (new Exception("Go Home"));
Marshal.FreeHGlobal(preAllocated); preAllocated = IntPtr.Zero;
}

static void Main(string[] args)
{

string message = "This is a test" ;
IntPtr hWnd = FindWindow("Example", "" );
if ( hWnd == IntPtr.Zero){

}else{

COPYDATASTRUCT cds ;
cds.dwData = 1;
cds.cbData = message.Length + 1;
cds.lpData = Marshal.StringToHGlobalAnsi(message);
IntPtr cdsBuffer = IntPtrAlloc ( cds ) ;
PostMessage(hWnd, WM_COPYDATA, IntPtr.Zero, cdsBuffer);
IntPtrFree(cds.lpData);
IntPtrFree(cdsBuffer);
}
}
}
}


#include <tchar.h>
#include <windows.h>

#define WND_CLASS_NAME _T ( "Example" )

LRESULT CALLBACK WndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) ;

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){
WNDCLASSEX ex ;
MSG msg ;
ex.cbClsExtra = 0 ;
ex.cbSize = sizeof ( WNDCLASSEX ) ;
ex.cbWndExtra = 0 ;
ex.hbrBackground = ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) ;
ex.hCursor = LoadCursor ( NULL, _T ( "IDC_ARROW" ) ) ;
ex.hIcon = LoadIcon ( NULL, _T ( "IDI_APPLICATION" ) ) ;
ex.hIconSm = LoadIcon ( NULL, _T( "IDI_APPLICATION" ) ) ;
ex.hInstance = hInstance ;
ex.lpfnWndProc = (WNDPROC )WndProc ;
ex.lpszClassName = WND_CLASS_NAME ;
ex.lpszMenuName = NULL ;
ex.style = 0 ;
if ( !RegisterClassEx ( &ex ) ){
return 0 ;
}
HWND hWnd = CreateWindow ( WND_CLASS_NAME, _T ( "" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ) ;
if ( !hWnd ){
UnregisterClass ( WND_CLASS_NAME, hInstance ) ;
return 0 ;
}

ShowWindow(hWnd, SW_HIDE ) ;
UpdateWindow ( hWnd ) ;
if ( !ChangeWindowMessageFilter ( WM_COPYDATA, MSGFLT_ADD ) ){
MessageBox ( HWND_DESKTOP, _T("Failed to change message filter"),_T("STATUS"), MB_OK ) ;
}
while ( TRUE ) {
UINT res = GetMessage ( &msg, hWnd, 0, 0 ) ;
if ( res == 0 ){
break ;
}else if ( res <0){

}else{
DispatchMessage ( &msg ) ;
}
}

return 0 ;
}

LRESULT CALLBACK WndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){
PCOPYDATASTRUCT pcds;
switch ( uMsg ){
case WM_CREATE :
break ;
case WM_COPYDATA :
pcds=(PCOPYDATASTRUCT)lParam;
if ( pcds->cbData > 0 && pcds->cbData < 512 ){
if ( pcds->dwData == 1 ){
((CHAR*)pcds->lpData)[pcds->cbData-1] = ‘\0‘ ;
MessageBoxA ( HWND_DESKTOP, (LPCSTR)pcds->lpData, "STATUS", MB_OK ) ;
}else if ( pcds->dwData == -1 ){
((CHAR*)pcds->lpData)[pcds->cbData-1]= L‘\0‘ ;
MessageBoxW ( HWND_DESKTOP, (LPCWSTR)pcds->lpData, L"STATUS", MB_OK ) ;
}
}

break ;
case WM_DESTROY :
PostQuitMessage(0);
default :
return DefWindowProc ( hWnd, uMsg, wParam, lParam ) ;
}
return 0L ;

}

C# using SendMessage, problem with WM_COPYDATA z

时间: 2024-10-11 02:14:45

C# using SendMessage, problem with WM_COPYDATA z的相关文章

进程通信之一 使用WM_COPYDATA C++及C#实现 z

原文地址:http://blog.csdn.net/morewindows/article/details/6804157 进程间通信最简单的方式就是发送WM_COPYDATA消息.本文提供C++及C#程序相互通信的二种实现方式.这样消息的接收端可以用C++实现,发送端可以用C++或C#实现. 发送WM_COPYDATA消息: SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&CopyData); 其中的CopyData为COPY

WM_COPYDATA实现的不同进程间通信

进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推送任务.原先想到使用,WCF以实现通信级别的调用,但对于后续新开发的软件来说,所需实现的东西太多(相当于需要实现一个既定接口的服务端).所以选择使用SendMessage,发送一个WM_COPYDATA以实现对新软件的通知任务.其中主要是需要对传输一个对象级的处理,需要进行序列化及反序列货处理,这是

通过WM_COPYDATA消息完成进程间通信

完成进程间通信最简单的方式就是发送WM_COPYDATA消息. (1)发送WM_COPYDATA消息 SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&copyData); 其中的copyData是要发送的数据,类型为COPYDATASTRUCT结构体: typedef struct tagCOPYDATASTRUCT { DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATAST

c#进程之间对象传递方法

1. 起源 KV项目下载底层重构升级决定采用独立进程进行Media下载处理,以能做到模块复用之目的,因此涉及到了独立进程间的数据传递问题. 目前进程间数据传递,多用WM_COPYDATA.共享dll.内存映射.Remoting等方式.相对来说,WM_COPYDATA方式更为简便,网上更到处是其使用方法. 而且Marshal这个静态类,其内置多种方法,可以很方便实现字符串.结构体等数据在不同进程间传递. 那么,对象呢?如何传递? 2.序列化 想到了,Newtonsoft.Json.dll这个神器.

C# 通过copydata实现进程间通信

最近公司需要实现一个基于copydata进程间通信的功能.原来一直没有接触过Windows的进程通信,这次正好可以学习一下. 程序是基于Winform的,下面直接上代码. 公共类: public class ImportFromDLL { public const int WM_COPYDATA = 0x004A; //启用非托管代码 [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public int d

修正单纯形法&#183;优化算法实现&#183;Java

修正单纯性法 代码如下: 舍去了输入转化的内容,主要包含算法关键步骤. public class LPSimplexM { private static final double inf = 1e9; private int n; // 约束个数 private double[][] A; // 输入函数参数 private double[] b; // 约束值 private double[] c; // 目标函数系数 private double Z; // 目标值 private void

codevs 1001 舒适的线路 kruskal/gcd

舒适的线路 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1001/ Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光. Z小镇附近共有N(1<N≤500)个景点(编号为 1,2,3,…,N),这些景点被M(0<M≤5000)条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许是为了保护该地的旅 游资源,Z小镇有个奇怪的规定,就是对于一条给定的

鞍点和极大极小理论

设$\phi: X \times Z \mapsto R$是闭凸函数,其中$X$和$Z$分别是$\mathbb{R}^n$和$\mathbb{R}^m$的非空子集,考虑如下的极大极小问题:\begin{align*}\min_{\boldsymbol{x}} & \ \sup_{\boldsymbol{z} \in Z} \phi(\boldsymbol{x}, \boldsymbol{z}) \\ \mbox{s.t.} & \ \boldsymbol{x} \in X. \end{al

C# WPF,通过自定义协议,向其它进程发送参数

注册协议 http://www.cnblogs.com/CodingArt/p/4532465.html 与非托管代码交互操作 如何:实现回调函数 互操作封送处理 IntPtr 结构 利用SendMessage实现winform与wpf之间的消息传递 UnsafeNativeMethods.cs /* * https://msdn.microsoft.com/zh-cn/library/843s5s5x%28v=vs.100%29.aspx * 输出本地计算机上每个窗口的句柄值 * 使用 Enu