本篇文章给大家谈谈c语言sendmessage,以及C语言编译器对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、C语言,如何向“被调用的外部EXE文件”传送数据2、不明白C语言的SendMessage函数3、c语言的时间问候语怎么写?4、c语言windows程序,如何给其他程序传递消息。5、如何用C语言实现向某个IP发送数据包(例如4个浮点数)?6、C语言什么函数能发送鼠标移消息?postmessage能吗
C语言,如何向“被调用的外部EXE文件”传送数据
不知道你介不介意用(匿名)管道的方式来实现,通过它的转向功能,可以很容易得到调用程序的输出,并可进行交互。msdn中CreatePipe 函数提供了这方面的例子。还有一个例子,当年写bcb插件ddkbuild编译驱动程序时写的:
void __fastcall BuildAndMessage(AnsiString PathToBuild/*=NULL*/, AnsiString Set/*=NULL*/)
{
AnsiString CommandStr = MakeCommandStr(PathToBuild, Set);
//ShowMessage(CommandStr);
// 读管道
HANDLE hChildStdinWr/*父进程写*/, hChildStdinRd/*子进程读*/;
// 写管道
HANDLE hChildStdoutWr/*子进程写*/, hChildStdoutRd/*父进程读*/;
SECURITY_ATTRIBUTES sa;
_di_IOTAMessageServices MessageServices;
_di_IOTAMessageGroup MessageGroup;
if (BorlandIDEServices-Supports(MessageServices))
{
MessageServices-ClearToolMessages(NULL);
MessageGroup = MessageServices-AddMessageGroup(“Ddkbuild”);
MessageServices-ShowMessageView(MessageGroup);
}
else
{
ShowMessage(“Create ddkbuild messageview failed”);
return;
}
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
// 创建子进程写管道
if (!CreatePipe(hChildStdoutRd, hChildStdoutWr, sa, 0))
{
ShowMessage(“Create Stdout pipe failed”);
return;
}
SetHandleInformation(hChildStdoutRd, HANDLE_FLAG_INHERIT, 0); // 该句柄子进程没用到,故取消继承性
// 创建子进程读管道
if (!CreatePipe(hChildStdinRd, hChildStdinWr, sa,0))
{
ShowMessage(“Create StdinRd pipe failed”);
return;
}
SetHandleInformation(hChildStdinWr, HANDLE_FLAG_INHERIT, 0); // 该句柄子进程没用到,故取消继承性
//SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr);
//SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd);
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdInput = hChildStdinRd; // 重定向子进程输入
si.hStdOutput = hChildStdoutWr; // 重定向子进程输出
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
// 注意使用了true,这样创建子进程时,父进程的所有可继承的句柄就可以被继承下来了
// 我们也可以使用SetHandleInformation使句柄不可被继承,这样子进程就无法使用了
// 这样的例子可以看《Creating a Child Process with Redirected Input and Output.doc》
if (!CreateProcess(NULL, CommandStr.c_str(), NULL, NULL, true, 0, NULL, NULL, si, pi))
{
ShowMessage(“Create process failed”);
return;
}
// 将数据写入子进程,这里只是演示,本程序不需要写入
const char *strIn = ” “;
DWORD dwBytes = 0;
WriteFile(hChildStdinWr, strIn, strlen(strIn), dwBytes, NULL);
CloseHandle(hChildStdinWr); // 保证对端的ReadFile可返回
// 调用ReadFile前须关闭,否则因写管道写入端有未关闭的Write句柄,ReadFile最后无法返回0
CloseHandle(hChildStdoutWr);
// 从子进程中读出执行结果,不处理mbcs,需要的朋友请加上前导字符的判断
char strData[MAX_PATH * 2];
AnsiString MessageComplete, MessageCut;
char* pos;
char lf = ‘\n’;
void* Unused = 0;
while (ReadFile(hChildStdoutRd, strData, sizeof(strData), dwBytes, NULL))
{
strData[dwBytes] = 0;
if (pos = strrchr(strData, lf)) // 如果有换行,则显示
{
*(pos-1) = 0;
pos++;
MessageComplete = MessageCut + strData;
MessageCut = pos;
MessageServices-AddToolMessage(
“”, MessageComplete, “Ddkbuild”, 0, 0, NULL, Unused, MessageGroup);
}
else // 否则暂存
MessageCut = MessageCut + strData;
Application-ProcessMessages();
}
MessageServices-AddToolMessage(
“”, MessageCut, “Ddkbuild”, 0, 0, NULL, Unused, MessageGroup);
// 关闭句柄
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdoutRd);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
不明白C语言的SendMessage函数
不是等于VM_ 应该是WM_。
WM指的是WindowMessage 即windows消息。
以WM_开头的是预定义的windows消息。
windows是基于消息驱动的操作系统,当程序接收到系统发送的消息后会做出相应的响应。
例如程序向窗口发送一个 WM_PAINT消息,则窗口会重新绘制。
c语言的时间问候语怎么写?
public final void schedulePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges, boolean dontReport) {
sendMessage(
finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
token,
(userLeaving ? 1 : 0) | (dontReport ? 2 : 0),
configChanges);
}
c语言windows程序,如何给其他程序传递消息。
大概思路是
你要获取这个窗口的句柄,因为有了窗口句柄,你想干什么就可以干什么了。比如枚举窗口下的子窗口句柄,然后发送数据就行了。
可是要获取句柄,是不是应该要找到对应的进程?QQ在内核方面下了功夫,把很多关键函数hook了。所以你需要利用ARK内核级别的软件工具查看到底哪些函数被hook了,然后通过手动或者编程实现还原。这样你才有机会获取QQ的进程。
就上面说的,实现起来就很难了。
说白了就是过QQ的驱动保护,这些技术可以参考《rootkit-windows内核的安全防护》等书籍。不过前提是基础要好,不然看不懂。
如何用C语言实现向某个IP发送数据包(例如4个浮点数)?
使用socket编程即可。
1、网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
2、下面用Socket实现一个windows下的c语言socket通信例子,这里客户端传递一个字符串,服务器端进行接收。
【服务器端】
#include “stdafx.h”
#include stdio.h
#include winsock2.h
#include winsock2.h
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //侦听套接字,连接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用于遍历信息的指针
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, wsaData);
if(ret!=0)
{
printf(“WSAStartup() failed!\n”);
return;
}
//创建Socket,使用TCP协议
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
WSACleanup();
printf(“socket() faild!\n”);
return;
}
//构建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
//绑定
ret = bind(sListen, (struct sockaddr *)saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf(“bind() faild! code:%d\n”, WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}
//侦听连接请求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf(“listen() faild! code:%d\n”, WSAGetLastError());
closesocket(sListen); //关闭套接字
return;
}
printf(“Waiting for client connecting!\n”);
printf(“Tips: Ctrl+c to quit!\n”);
//阻塞等待接受客户端连接
while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{
length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)saClient, length);
if (sServer == INVALID_SOCKET)
{
printf(“accept() faild! code:%d\n”, WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}
char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)receiveMessage;
while(nLeft0)
{
//接收数据
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{
printf(“recv() failed!\n”);
return;
}
if (ret == 0) //客户端已经关闭连接
{
printf(“Client has closed the connection\n”);
break;
}
nLeft -= ret;
ptr += ret;
}
printf(“receive message:%s\n”, receiveMessage);//打印我们接收到的消息。
}
// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}
【客户端】
#include “stdafx.h”
#include stdio.h
#include stdlib.h
#include winsock2.h
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //连接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, wsaData);
if(ret!=0)
{
printf(“WSAStartup() failed!\n”);
return;
}
//确认WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf(“Invalid WinSock version!\n”);
return;
}
//创建Socket,使用TCP协议
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf(“socket() failed!\n”);
return;
}
//构建服务器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
saServer.sin_addr.S_un.S_addr = inet_addr(“192.168.1.127”);
//连接服务器
ret = connect(sClient, (struct sockaddr *)saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf(“connect() failed!\n”);
closesocket(sClient); //关闭套接字
WSACleanup();
return;
}
char sendMessage[]=”hello this is client message!”;
ret = send (sClient, (char *)sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{
printf(“send() failed!\n”);
}
else
printf(“client info has been sent!”);
closesocket(sClient); //关闭套接字
WSACleanup();
}
C语言什么函数能发送鼠标移消息?postmessage能吗
可以
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
关于后两个类型:
typedef UINT WPARAM;
typedef LONG LPARAM;
都是4字节
hWnd–要发给的程序句柄
Msg:
Msg=WM_MOUSEMOVE..鼠标移动事件
wParam:
MK_CONTROL ctrl键按下.
MK_LBUTTON 鼠标左键键按下.
MK_MBUTTON 鼠标中间键按下.
MK_RBUTTON 鼠标右键按下.
MK_SHIFT shift键按下.
lParam–高位当前鼠标y坐标,低位当前鼠标x坐标
比如给句柄为hWnd的程序队列发送一个鼠标移动信息,同时鼠标左键和中间处于按下状态,鼠标坐标为(120,100)
PostMessage(hWnd, WM_MOUSEMOVE ,MK_LBUTTON|MK_MBUTTON,(16100)|120);
如果是要发送数据,然后你在程序端自己处理的话,推荐用sendmessage函数,因为PostMessage只是把消息发送到程序的消息队列去,程序自动处理.就是说,如果接收消息的程序是你自己写,用sendmessage就可以,如果是别人写的程序,你要仿真一个事件给那个程序,那么就用PostMessage
如果用
SendMessage(Hwnd, WM_MOUSEMOVE , x, y);
其中
x:wParam,取值范围
MK_CONTROL Set if the ctrl key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the shift key is down.
y:lParam,鼠标的坐标
xPos = LOWORD(lParam); //horizontal position of cursor
yPos = HIWORD(lParam); //vertical position of cursor
你就可以在程序里重载虚函数LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
switch(message)
{
case WM_MOUSEMOVE:
//写你要在鼠标移动时做的处理
break;
…..
}
CDialog::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
}
CDialog::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);是MFC自己的处理函数,最好加上,不然会很麻烦
很简单的SendMessage和postmessage一样使用方法
c语言sendmessage的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于C语言编译器、c语言sendmessage的信息别忘了在本站进行查找喔。