c++实现右下角弹窗

385 阅读4分钟



c++实现右下角弹窗

我们看到有很多程序都有右下角弹出广告的情况,总是弹出广告来,关都关不了,网页上弹窗很好实现,html或者js,都可以做到,但是c++怎么去实习呢,确实,有点奇葩,

首先,我们要吧这个窗口写好,怎么写呢,创建一个vs2013的win32工程项目,创建mfc窗口也可以,代码自己就出来了,然后在,创建窗口的函数里改一下窗口的类型和位置就可以了,
hWnd = CreateWindow(szWindowClass, szTitle, WS_SYSMENU,
1250, 565, 350, 300, NULL, NULL, hInstance, NULL);

然后,在消息处理函数WndProc()里去实现,显示字符啊,图片啊,或者播放音乐

hdc = BeginPaint(hWnd, &ps);
PlaySound(TEXT("C:\\testa.wav"), NULL, SND_FILENAME | SND_ASYNC);//播放音乐
TextOut(hdc, 0, 0, wszName, 20);//显示字符
EndPaint(hWnd, &ps);//显示图片

当然,还不够完整对不对,我调用他的时候怎么传数据呢,你可以用共享内存,或者创建一个文件来传递,我的其它文章里面有共享内存的代码,我也是这样用的

  写完之后呢,在debug文件夹里面有一个.exe文件,用创建进程的函数CreateProcessW()去调用.exe文件就可以弹出窗口了。

窗口代码:vs2013//win32项目运行

// Win32Project2.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "Win32Project2.h"
#include"mmsystem.h "
#include <fstream>
#define MAX_LOADSTRING 100
#pragma comment(lib, "winmm.lib")
// 全局变量:
HINSTANCE hInst;        // 当前实例
TCHAR szTitle[MAX_LOADSTRING];     // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];   // 主窗口类名

WCHAR wszName[256];

// 此代码模块中包含的函数的前向声明:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);


typedef struct _TShareMem
{
char Data[256];
}TShareMem;//创建共享内存结构体
HANDLE hMap;
HANDLE hAddress;
int iErrCode;

\

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR    lpCmdLine,
_In_ int       nCmdShow)
{
TShareMem* pShareMem1;
//打开刚刚创建的共享内存区
hMap = ::OpenFileMapping(FILE_MAP_WRITE, false, _T("NewMap"));//返回句柄
if (hMap == 0)
{
iErrCode = GetLastError();
//MessageBox(NULL, L"不能定位内存映射文件块!", L"error", MB_OKCANCEL);
}
//读共享内存区
pShareMem1 = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); //返回共享内存地址并强转

 if (pShareMem1 == NULL)
//MessageBox(NULL, L"Can''t View Memory Map!", L"error", MB_OKCANCEL);

  if (pShareMem1 != NULL){
memset(wszName, 0, sizeof(wszName));
//拷贝共享内存区的内容
CopyMemory(wszName, pShareMem1, 255);
}

 UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

  // TODO:  在此放置代码。
MSG msg;
HACCEL hAccelTable;

 // 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

 // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT2));

 // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

 return (int) msg.wParam;
}

\

//
//  函数:  MyRegisterClass()
//
//  目的:  注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

 wcex.cbSize = sizeof(WNDCLASSEX);

 wcex.style   = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra  = 0;
wcex.cbWndExtra  = 0;
wcex.hInstance  = hInstance;
wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT2));
wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 return RegisterClassEx(&wcex);
}

//
//   函数:  InitInstance(HINSTANCE, int)
//
//   目的:  保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_SYSMENU,
1250, 565, 350, 300, NULL, NULL, hInstance, NULL);

   if (!hWnd)
{
return FALSE;
}

   ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数:  WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND - 处理应用程序菜单
//  WM_PAINT - 绘制主窗口
//  WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

 switch (message)
{
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
PlaySound(TEXT("C:\\testa.wav"), NULL, SND_FILENAME | SND_ASYNC);//播放音乐
TextOut(hdc, 0, 0, wszName, 20);//显示字符
// TODO:  在此添加任意绘图代码...
EndPaint(hWnd, &ps);//显示图片
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

 case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}

调用.exe文件代码vs2013:win32窗口程序运行

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include<windows.h>
#include<iostream>

using namespace std;

\

typedef struct _TShareMem
{
char Data[256];
}TShareMem;//创建共享内存结构体
HANDLE hMap;
HANDLE hAddress;
int iErrCode;

int _tmain(int argc, _TCHAR* argv[])
{

char strShare[256] ="共享内存";
char szBuf[256];
TShareMem* pShareMem;
TShareMem* pShareMem1;
//创建共享内存,这个函数的最后一个参数即是创建的共享内存的名称
hMap = ::CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, sizeof(TShareMem), _T("NewMap"));

 if (hMap == NULL)
{
iErrCode = GetLastError();
MessageBox(NULL,L"不能创建内存映射文件!",L"error",MB_OKCANCEL);
}
//写共享内存区,将内存映射为文件
pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);//返回共享内存地址强转类型

 memcpy(pShareMem, strShare, strlen(strShare));//将数据拷贝进共享内存

\


//打开刚刚创建的共享内存区
hMap = ::OpenFileMapping(FILE_MAP_WRITE, false, _T("NewMap"));//返回句柄
if (hMap == 0)
{
iErrCode = GetLastError();
MessageBox(NULL, L"不能定位内存映射文件块!", L"error", MB_OKCANCEL);

}
//读共享内存区
//hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
pShareMem1 = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); //返回共享内存地址并强转

 if (pShareMem1 == NULL)
MessageBox(NULL, L"Can''t View Memory Map!", L"error", MB_OKCANCEL);

 memset(szBuf, 0, sizeof(szBuf));
//拷贝共享内存区的内容
CopyMemory(szBuf, pShareMem1, 255);

\


wstring szCmdLine = L"C:\\Users\\Jin\\Documents\\Visual Studio 2013\\Projects\\Win32Project2\\Debug\\Win32Project2.exe";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.wShowWindow = 1;
//si.dwFlags = STARTF_USESHOWWINDOW;
BOOL ret = ::CreateProcessW(
NULL,
&szCmdLine[0],
NULL,
NULL,
0,
0,
NULL,
NULL,
&si,
&pi);
if(ret)
{
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
std::cout<<"新进程的id:"<<pi.dwProcessId<<std::endl
<<"Thread id:"<<pi.dwThreadId<<std::endl;
}

 return 0;
}

\

\