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 = ;
cds.cbData = message.Length + ;
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 = ;
ex.cbSize = sizeof ( WNDCLASSEX ) ;
ex.cbWndExtra = ;
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 = ;
if ( !RegisterClassEx ( &ex ) ){
return ;
}
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 ;
} 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, , ) ;
if ( res == ){
break ;
}else if ( res <){ }else{
DispatchMessage ( &msg ) ;
}
} return ;
} 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 > && pcds->cbData < ){
if ( pcds->dwData == ){
((CHAR*)pcds->lpData)[pcds->cbData-] = '\0' ;
MessageBoxA ( HWND_DESKTOP, (LPCSTR)pcds->lpData, "STATUS", MB_OK ) ;
}else if ( pcds->dwData == - ){
((CHAR*)pcds->lpData)[pcds->cbData-]= L'\0' ;
MessageBoxW ( HWND_DESKTOP, (LPCWSTR)pcds->lpData, L"STATUS", MB_OK ) ;
}
} break ;
case WM_DESTROY :
PostQuitMessage();
default :
return DefWindowProc ( hWnd, uMsg, wParam, lParam ) ;
}
return 0L ; }
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 ...
- WM_COPYDATA实现的不同进程间通信
进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推 ...
- 进程通信之一 使用WM_COPYDATA C++及C#实现(转)
进程间通信最简单的方式就是发送WM_COPYDATA消息.本文提供C++及C#程序相互通信的二种实现方式.这样消息的接收端可以用C++实现,发送端可以用C++或C#实现. 发送WM_COPYD ...
- 使用 WM_COPYDATA 在进程间共享数据
开发中有时需要进程间传递数据,比如对于只允许单实例运行的程序,当已有实例运行时,再次打开程序,可能需要向当前运行的实例传递信息进行特殊处理.对于传递少量数据的情况,最简单的就是用SendMessage ...
- ACM_小Z的A+B
小Z的A+B Time Limit: 2000/1000ms (Java/Others) Problem Description: 小Z最喜欢A+B了,没事就研究研究,比如什么大整数A+B(就是100 ...
- Andrew Ng机器学习公开课笔记 -- 支持向量机
网易公开课,第6,7,8课 notes,http://cs229.stanford.edu/notes/cs229-notes3.pdf SVM-支持向量机算法概述, 这篇讲的挺好,可以参考 先继 ...
- apache win openssl
Rubayat Hasan Software Development, Music, Web Design, life, thoughts… Home Portfolio Projects Con ...
- c#进程之间对象传递方法
1. 起源 KV项目下载底层重构升级决定采用独立进程进行Media下载处理,以能做到模块复用之目的,因此涉及到了独立进程间的数据传递问题. 目前进程间数据传递,多用WM_COPYDATA.共享dll. ...
- Delphi跨进程访问DBGRID
要想跨进程访问DBGRID,貌似只能用HOOK,写一个DLL想办法注入到目标进程.注入成功后,使DLL与目标进程在同一进程空间中(其内有一些细节问题,请参见代码),这时可以访问目标进程的VCL组件.并 ...
随机推荐
- 常见架构TLB miss处理方法(转)
转自网站:http://blog.sina.com.cn/s/blog_633f462901018reb.html 0. 综述 总的来说TLB miss处理分为硬件处理和软件处理两种,硬件 ...
- C#和Js 编码和解码方法
Server.UrlDecode(); Server.UrlEncode(); Server.HtmlDecode(); Server.HtmlEncode();
- python 知识 rstrip,strip,lstrip
rstrip,strip,lstrip 作用:去除字符串中的空格或指定字符 一.默认用法:去除空格str.strip() : 去除字符串两边的空格str.lstrip() : 去除字符串左边的空格s ...
- java小提示:标示符常见命名规则、常用ASCII
标示符常见命名规则: A:包:全部小写B:类或者接口:首字母大写:StudentC:方法或者接口:首字母小写,第二个单词开始开始,每个单词首字母大写:studentAgeD:常量:全部大写,多个单词之 ...
- POJ1734 - Sightseeing trip
DescriptionThere is a travel agency in Adelton town on Zanzibar island. It has decided to offer its ...
- mysql.zip免安装版配置
MYSQL ZIP免安装版配置 1. 下载MySQL 选择自己想要的.本次安装.我使用的是mysql-5.6.17-winx64 地址:http://dev.mysql.com/downloads/ ...
- webApp添加到iOS桌面
iOS中的safri浏览器可以将一个网页添加到桌面,当做一个独立的应用运行. 当然,这里我们不讨论怎么去做一个webApp,这需要html5的相关知识和开发经验.这里我们只讲webApp添加桌面后到启 ...
- C#取中间文本
/// <summary> /// 取中间文本 + static string GetMiddleStr(string oldStr,string preStr,string nextSt ...
- Form表单学习网站
HTML表单 -- form标签 -- 与浏览者交互:http://www.dreamdu.com/xhtml/tag_form/
- 搭建 Android 开发环境,初试HelloWorld (win7) (下) (转)
5. 创建AVD 为使Android应用程序可以在模拟器上运行,必须创建AVD. 在Eclipse菜单中,选择 Windows -> Android Virtual Device Manage ...