1. 程式人生 > >【Qt】Qt之程序間通訊(Windows訊息)【轉】

【Qt】Qt之程序間通訊(Windows訊息)【轉】

簡述

通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。

效果

這裡寫圖片描述

傳送訊息

自定義型別與接收窗體

包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理訊息過多情況下,對訊息的區分,如果不需要也可以去掉。

#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include <qt_windows.h>
#endif

const ULONG_PTR CUSTOM_TYPE = 10000;
const QString c_strTitle = "ReceiveMessage"
;

傳送資料

點選按鈕,進行訊息傳送。裡面的do{…}while用來忽略本視窗,當然自身也可以接受自身的訊息。

void onSendMessage()
{
    HWND hwnd = NULL;
    //do
    //{
       LPWSTR path = (LPWSTR)c_strTitle.utf16();  //path = L"SendMessage"
       hwnd = ::FindWindowW(NULL, path);
    //} while (hwnd == (HWND)effectiveWinId()); // 忽略自己

    if (::IsWindow(hwnd))
    {
        QString filename = QStringLiteral("程序通訊-Windows訊息"
); QByteArray data = filename.toUtf8(); COPYDATASTRUCT copydata; copydata.dwData = CUSTOM_TYPE; // 使用者定義資料 copydata.lpData = data.data(); //資料大小 copydata.cbData = data.size(); // 指向資料的指標 HWND sender = (HWND)effectiveWinId(); ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast
<WPARAM>(sender), reinterpret_cast<LPARAM>(&copydata)); } }

接收訊息

設定標題

這一步很重要,必須與上一步的c_strTitle保持一致,否則會找不到窗體。自定義型別CUSTOM_TYPE也必須保持一致,進行過濾。

setWindowTitle("ReceiveMessage");

重寫nativeEvent

bool nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG *param = static_cast<MSG *>(message);

    switch (param->message)
    {
    case WM_COPYDATA:
    {
        COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(param->lParam);
        if (cds->dwData == CUSTOM_TYPE)
        {
            QString strMessage = QString::fromUtf8(reinterpret_cast<char*>(cds->lpData), cds->cbData);
            QMessageBox::information(this, QStringLiteral("提示"), strMessage);
            *result = 1;
            return true;
        }
    }
    }

    return QWidget::nativeEvent(eventType, message, result);
}

相關推薦

QtQt程序通訊Windows訊息

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理訊息過多情況下,對訊息的區分,如果不需要也可以去掉。

Qt 程序通訊Windows 訊息

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 | 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理

QtQt程序通訊共享記憶體

簡述 上一節中,我們分享下如何利用Windows訊息機制來進行不同程序間的通訊。但是有很多侷限性,比如:不能跨平臺,而且必須兩個程序同時存在才可以,要麼程序A發了訊息誰接收呢? 下面我們來分享另外一種跨平臺的進行間通訊的方式-Shared Memory(共享記憶體)。 簡述 注意事項

QtQt程序通訊QProcess

簡述 前幾節裡,分享了程序通訊的幾種方式:Windows訊息機制、Shared Memory(共享記憶體),本節講解下關於程序通訊的另外一種方式-QProcess。 簡述 命令列讀取 說明 實現 更多參考 命令列引數啟動 說明 程序A-帶參啟動

QtQt程序通訊IPC

簡述 程序間通訊,就是在不同程序之間傳播或交換資訊。那麼不同程序之間存在著什麼雙方都可以訪問的介質呢?程序的使用者空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享記憶體區。但是,系統空間卻是“公共場所”,所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩

Qt 程序通訊QProcess

簡述 QProcess可以在應用程式內部與其它程序通訊,或啟動其它應用程式。與在終端機之類的命令輸入視窗上使用名稱和引數是一樣的,可以使用QProcess提供的函式start()啟動程序。可以註冊QStringList處理程序後的引數。 | 命令列引數啟

程序程式設計程序通訊-管道和訊息佇列

1.程序間通訊 Linux作為一種新興的作業系統,幾乎支援所有的Unix下常用的程序間通訊方法:管道、訊息佇列、共享記憶體、訊號量、套介面等等。 2.管道 管道是程序間通訊中最古老的方式,它包括無名管道(或者匿名管道)和有名管道兩種,前者用於父程序和

程序通訊IPC機制精煉詳解

一、前期基礎知識儲備IPC定義:IPC是intent-Process Communication的縮寫,含義為程序間通訊或者跨程序通訊,是指兩個程序之間進行資料交換的過程。IPC不是Android所獨有的,任何一個作業系統都需要有相應的IPC機制,比如Windows上可以通過

程序通訊PIPE呼叫

看過了高階的popen呼叫之後,我們來了解一下底層的pipe函式。popen函式用過啟動一個shell來解釋請求的命令。而pipe不需要啟動shell來解釋。 #include<unistd.h> int pipe(int file_descriptor[2]

Linux 程序通訊共享記憶體

上篇部落格我們講了,匿名管道,命名管道,訊息佇列,並使用了他們,初步瞭解了程序間通訊的概念。下面我們要說共享記憶體。 共享記憶體函式 shmget函式 功能:用來建立共享記憶體 原型 int shmget(key_t key,size_t si

QT程序程序通訊IPC

程序是作業系統的基礎之一。一個程序可以認為是一個正在執行的程式。我們可以把程序當做計算機執行時的一個基礎單位。關於程序的討論已經超出了本章的範疇,現在我們假定你是瞭解這個概念的。 在 Qt 中,我們使用QProcess來表示一個程序。這個類可以允許我們的應用程式開啟一個新的外部程式

Linux程序通訊IPC訊號量詳解與測試用例

學習環境centos6.5 Linux核心2.6 程序間通訊概述 1. 程序通訊機制 一般情況下,系統中執行著大量的程序,而每個程序之間並不是相互獨立的,有些程序之間經常需要互相傳遞訊息。但是每個程序在系統中都有自己的地址空間,作業系統通過頁表

Linux程序通訊IPC訊息佇列詳解及測試用例

學習環境 Centos6.5 Linux 核心 2.6 什麼是訊息佇列? 訊息佇列是SystemV版本中三種程序通訊機制之一,另外兩種是訊號量和共享儲存段。訊息佇列提供了程序間傳送資料塊的方法,而且每個資料塊都有一個型別標識。訊息佇列是基於訊息的,而管

Linux程序通訊IPC共享記憶體詳解與測試用例

學習環境centos6.5 Linux核心2.6 什麼是共享記憶體 共享記憶體允許兩個或更多程序訪問同一塊記憶體。當一個程序改變了這塊記憶體中的內容的的時候,其他程序都會察覺到這個更改。 效率: 因為所有程序共享同一塊記憶體,共享記憶體在各種程序

Chrome原始碼剖析Chrome的程序通訊

【二】Chrome的程序間通訊 1. Chrome程序通訊的基本模式 程序間通訊,叫做IPC(Inter-Process Communication),在Chrome不多的文件中,有一篇就是介紹這個的,在這裡。Chrome最主要有三類程序,一類是Browser主程序,我們一

作業系統程序通訊C#

程序間通訊命名管道程序間通訊的一種方式,Pipes:管道,分為無名管道:在父子程序間交換資料;有名管道:可在不同主機間交換資料,分為伺服器方和客戶方,在Win9X下只支援有名管道客戶。命名管道的命名命名管道是一個有名字的,單向或雙向的通訊管道。管道的名稱有兩部分組成:計算機名

Qt程序通訊--------QProcess

       Qt提供了一個QProcess類用於啟動一個外部程式並與之通訊。啟動一個新程序的操作十分簡單,只需要將待啟動的程式名稱和啟動引數傳遞給start()函式即可。 m_pPro = new

程序程式設計程序通訊-共享記憶體,訊號量和套接字

1. 背景 本文將介紹程序通訊中的訊號量,共享記憶體和套接字方法。 2. 訊號量 2.1 訊號量的定義 為了防止出現因多個程式同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行執行緒

程序程式設計程序通訊

  程序間通訊(Interprocess Communication, IPC),經典的IPC:管道、FIFO、訊息佇列、訊號量以及共享儲存和套接字。   一、管道   管道是UNIX系統IPC的最古老的形式,所有的UNIX系統都提供此種通訊機制。   1·、兩

一步一步學linux程序通訊——訊息佇列

一、什麼是訊息佇列:訊息佇列提供了一種程序與程序間傳送資料塊的一種方法,每個資料塊含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構,可以通過傳送訊息來避免同步和阻塞問題。訊息佇列有最大長度限制       在分散式計算環境下,訊息佇列是為了對異構網路環境下的分散式應