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组件.并 ...
随机推荐
- EXTJS 4.2 资料 控件textfield中fieldLabel去掉冒号,控件label的长度
代码: labelSeparator: '', // 去掉laebl中的冒号 labelWidth: 10,//控件label的长度
- OGRE1.8.1源码编译(VS2008)
最近在学习图形学,想看看OGRE源码,于是就去OGRE官网下载源码,配置环境,这里记录一下.鉴于电脑太破,VS2010比较慢,所以使用VS2008. 准备工作: CMake2.8 下载地址 ...
- bnuoj 1057 函数(模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=1057 [题意]:给定x的值,带入f(x)求函数值 [题解]:注意第一个数的符号可能是'+',这里把我 ...
- 第二好用的时间日期选择插件(jscal)
这个是第二好用的了,支持鼠标滚动选择时间.功能很强大,文档:http://www.dynarch.com/jscal/ 效果图: <!DOCTYPE html PUBLIC ...
- 相似元素存在的意义---HTML&CSS
1.<q> 效果: 告诉浏览器这是一段短引用,让浏览器以合适的方法来显示 注: 不能直接以双引号直接代替<q>,因为有些浏览器<q>的效果不是双引号. 不要忘了移动 ...
- Java-使用js进行编码,后台解码。
1:使用js编码 var value=window.encodeURI(window.encodeURI(strValue)); 2:Java类中解码. String str=URLDecoder.d ...
- fiddler插件开发step by step 1
Fiddler 是优秀的抓包工具,有着众多的优秀插件.Fiddler 软件是由C#语言开发的,运行在.net Framework 框架之上,所以我们也可以使用vs来开发自己的Fiddler插件,下面就 ...
- Weblogic下部署的应用,当更新文件时需要重新安装部署
JSP页面检查(秒):-1 Servlet重新加载检查(秒):-1 -1说明从不检查,故当更新文件时,需要重新部署,或重新安装部署.
- UIcollectionView的使用(首页的搭建2)
2.2 直接购买的UIcollectionCell 2.2.1创建CFPromptBuyCell,继承自UICollectionViewCell,定义了标题和图片两个属性 2.2.2 在.m文件中定义 ...
- redis的key过期时间
public void set(String key,String value,int liveTime){ this.set(key, value); this.getJedis().expire( ...