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组件.并 ...
随机推荐
- Java中“||”与“|”的区别
两者都是或,但是不一样.举个例实例给你看你就明白了: int i=0;if(3>2 || (i++)>1) i=i+1;System.out.println(i); 这段程序会打印出1,而 ...
- PHPCMS搭建wap手机网站
PHPCMS搭建PC端网站比较方便,但是在wap手机端方面却不怎么实用,而且自带的手机建站感觉不是很好,而且模版不好控制,现在对其进行修改,手机建站个人感觉比较方便 首先在phpcms/libs/fu ...
- 1041: [HAOI2008]圆上的整点 - BZOJ
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数.Input rOutput 整点个数Sample Input4Sample Output4HINT n ...
- jsp的静态包含与动态包含:<%@ include file="" %>和<jsp:include page=""></jsp:include>区别与分析
<%@ include file="" %>是将文件原封不动的copy进现有的文件中,像是拼接好后,再编译成为servlet运行. <jsp:include pa ...
- The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemK:K-Nice
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3212 题意:构造出一个n*m的有k个上下左右的和等于中间数的小矩阵的任意矩 ...
- [Ecmall]ECMALL目录结构设置与数据库表
最近在做ecmall的开发,ecmall在开源方面还有待进步啊,官方没有提供开发文档,也没有关于系统架构组织的贡献,使用者都要自己从0开始,官方论坛连二次开发板块都没有,都在哪瞎扯淡,广告一堆.可悲~ ...
- Android Spinner(级联 天气预报)
activity_spinner.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...
- PHP基础语法3
文件系统 判断文件是否存在 如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出, is_file是确切的 ...
- SaaS系列介绍之七: SaaS模式分析(下)
1 SaaS模式下的质量管理 质量管理是从事SaaS事业的企业管理的重要课题,质量管理的职能是质量方针.质量目标和质量指标的制定和贯彻实施,中心目标是促进产品质量.提高客户满意度. 软件质量要素包含以 ...
- vs 下 opengl 配置问题
项目 -->选择属性 C\C++-->preprocessor-->preprocessor definition 添加GLUT_BUILDING_LIB,中间用分号隔开. 然后点击 ...