qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good
qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个dll 中创建一个透明窗体,利用这个dll 获取win32 API 消息。
源码 已经在vs2010 vs6.0 qt 4.7 下试验通过
下面贴出 重要的实现源码:
VC dll- ReceiveMessage.cpp
#include "stdafx.h"
#include "resource.h"
typedef int (*CALLBACKFUNC)(DWORD Type, DWORD position);
CALLBACKFUNC pfnCallback_tmp;
HINSTANCE hInstance;
unsigned long WM_UNITOKEN_NOTIFY = RegisterWindowMessage("notify_HuFeng");
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hInstance = (HINSTANCE)hModule;
break;
}
return TRUE;
}
HWND m_hWnd = 0;
unsigned long nStep = 0;
unsigned long TotalStep = 0;
//INT_PTR __stdcall
BOOL CALLBACK DialogProcedure(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
case WM_CREATE:{
break;};
case WM_COMMAND:
{
SendMessage(hWnd, WM_DESTROY, 0, 0);
break;
};
case WM_DESTROY:{ PostQuitMessage(0); break; };
case WM_INITDIALOG : { break;};
default :{
if(Message==WM_UNITOKEN_NOTIFY)
{ pfnCallback_tmp(wParam,lParam); };break;}
}
return 0;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message==WM_DESTROY)
{
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
DWORD __stdcall ThreadFuction(LPVOID pParam)
{
MSG Msg;
HWND hWnd_HuFeng= CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOGH), NULL, DialogProcedure);
int erro = GetLastError();
ShowWindow(hWnd_HuFeng, SW_HIDE);
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
extern "C" void __stdcall ReceiveMessageFun(CALLBACKFUNC pfnCallback)
{
DWORD ThreadID;
HANDLE m_hThread;
pfnCallback_tmp = pfnCallback;
m_hThread=CreateThread(NULL, 0, ThreadFuction, NULL, 0, &ThreadID);
CloseHandle(m_hThread);
}
QT 接收部分
头文件.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "windows.h"
#include "qthread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
};
class MyThread : public QThread
{
public:
void run();
void foo();
};
#endif // MAINWINDOW_H
QT 接收部分
receive.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtCore/qobject.h>
#include <limits.h>
#include "QLibrary"
typedef int (* CALLBACKFUNC)(unsigned long Type, unsigned long position);
//extern "C" void __stdcall ReceiveMessageFun(CALLBACKFUNC pfnCallback);
CALLBACKFUNC pfnCallback;
int outputMsg(unsigned long Type, unsigned long position)
{
qDebug("Received Message");
return 0;
}
int main(int argc, char *argv[])
{
int m;
QApplication a(argc, argv);
//MainWindow w;
// outputMsg(12,34);
MyThread aa;
// aa.start();
aa.run();
// w.show();
return a.exec();
}
void MyThread::run()
{
QLibrary myLib("../ReceiveMessage");
if(myLib.load())
{
qDebug("link lib success");}
else
{
qDebug("link lib failed");
}
pfnCallback = outputMsg;
typedef void(*ReceiveMessageFun_HF)(CALLBACKFUNC pfnCallback);//库版本
ReceiveMessageFun_HF pGetLibraryVerion =(ReceiveMessageFun_HF)myLib.resolve("ReceiveMessageFun");
pGetLibraryVerion(pfnCallback);
// sleep(1);
}
QT 发送部分 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "windows.h"
#include "stdlib.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
void _SendNotify(DWORD fuccode,DWORD retcode);
private:
Ui::MainWindow *ui;
DWORD a,b;
private slots:
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
QT 发送部分
receive.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QFileDialog"
#include "QDebug"
#include "QTextCodec"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::on_pushButton_clicked()
{
a=200;
b=50;
MainWindow::_SendNotify(a, b);
}
void MainWindow::_SendNotify(DWORD fuccode, DWORD retcode)
{
unsigned long WM_UNITOKEN_NOTIFY=::RegisterWindowMessageW(L"notify_HuFeng");
PostMessageW(HWND_BROADCAST, WM_UNITOKEN_NOTIFY, fuccode, retcode);
}
代码不尽完善 只是提供一个思路
http://blog.csdn.net/hufengvip/article/details/5974814
qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good的更多相关文章
- Qt for windows消息循环、libqxt分析和wince快捷键处理
Qt for windows消息循环.libqxt分析和wince快捷键处理 利用Qt做windows图形界面开发和MFC相比,个人感觉还是比较简单好用的:首先利用Designer工具搞个ui文件:然 ...
- 使用 Qt 获取 UDP 数据并显示成图片
一个项目,要接收 UDP 数据包,解析并获取其中的数据,主要根据解析出来的行号和序号将数据拼接起来,然后将拼接起来的数据(最重要的数据是 R.G.B 三个通道的像素值)显示在窗口中.考虑到每秒钟要接收 ...
- [C语言](二)01 获取Windows图形构件大小信息
SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<& ...
- 获取Windows系统中的所有可用和在用串口
目的:获取Windows系统中的所有可用和在用串口 方法:注册表查询法 优点:简单.实用.快速.无遗漏,无多余结果. 说明:另外还有8种方法可以枚举串口,但都不如此法. 代码和详细注释如下: //-- ...
- 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)
不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...
- 手动修改ARM Linux的静态IP和用QT获取和修改IP
.vi /etc/network/interfaces # 找到“# Wired or wireless interfaces” .注释掉 iface eth0 inet dhcp 这是自动获取ip地 ...
- MFC/QT 学习笔记(二)——MFC入门
MFC以C++形式封装了Windows API //实践 编写MFC需要的头文件#include <afxwin.h> 程序执行流程: 实例化应用程序对象(有且只有一个) 执行程序入口函数 ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
- 通过PowerShell获取Windows系统密码Hash
当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...
随机推荐
- 怎样实现cocos2d-x之文字渲染
// 1.创建一段文本 // create函数的三个参数分别为:文本内容.字体和字体大小 CCLabelTTF *font=CCLabelTTF::create("Hello World&q ...
- 配置nexus仓库
Nexus有许多默认仓库:Central,Releases,Snapshots,和3rd Party 1.配置central仓库 Nexus内置了Maven中央代理仓库Central.选择仓库列表中的 ...
- Python学习笔记 — 函数
函数是对程序逻辑进行结构化或过程化的一种编程方法.函数具有两个方面的意义:1)将代码分块,易于管理和阅读:2)最大化代码复用和最小化代码冗余,节省空间,有助于保持一致性. 1. 函数定义 Python ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- Leetcode: Median of Two Sorted Arrays. java.
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
- 基于visual Studio2013解决C语言竞赛题之1055排序
题目 解决代码及点评 /* 功能:已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序) 请调用上述函数先将A[5]至A[ ...
- http协议与web本质
当你在浏览器地址栏敲入“http://www.csdn.net/”,然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是web开发人员,我想 ...
- Effective C++_笔记_条款04_确定对象被使用之前已先被初始化
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 读取未初始化的值会导致不确定的行为.在某些平台上,仅仅只是读取为 ...
- C#判断文件是否正在被使用
生成文件的时候,如果该文件夹下的同名文件被打开(或者被使用),如果这时再生成一个同名文件,则会提示文件正在被占用. 解决方法有两个,一个是保存的文件名改成该文件夹下不存在的(随机数之类的XXOO都行, ...
- Ruby on Rails 實戰聖經阅读(二)
1.操作系统 centos5.4 2.安装ruby yum install ruby 会安装得到 1.8.5 如果你公司用的是1.8.X就无所谓了, 拿这个学习就行了 如果你们公司用的是1.9.X,那 ...