WS_EX_LAYERED属性添加后出现的问题。(两天内必定结贴)

wuliao0419 2011-08-03 07:22:40

#include <windows.h>
#include <stdio.h>
#include<string>
#include <time.h>
using namespace std;
#define WS_EX_LAYERED 0x80000
typedef BOOL (WINAPI*FPT)(HWND,int,BOOL,DWORD);
FPT fp;
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="Weixin2003";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);

HWND hwnd;
hwnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED|WS_EX_TOOLWINDOW,"WinSunProc",NULL,WS_POPUP|WS_SYSMENU,
0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HMODULE hsad=LoadLibrary("user32.dll");
HDC hdc;
char str[]="I love You";
switch(uMsg)
{
case WM_CREATE:

fp=(FPT)GetProcAddress(hsad,"SetLayeredWindowAttributes");
FreeLibrary(hsad);
fp(hwnd,RGB(255,255,255),200,3);
MessageBox(hwnd,"","",MB_OK);
SetTimer(hwnd,1,1000,NULL);
break;
case WM_TIMER:

hdc = GetDC(hwnd);
TextOut(hdc,rand()%SM_CXSCREEN,rand()%SM_CYSCREEN,str,sizeof(str)-1);
break;

case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_LBUTTONDOWN:
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

程序希望的功能,在屏幕的桌面上每隔一秒中随机在某处打印 I love you。
我在createWindowEx中添加了 新的属性WS_EX_LAYERED,使得窗口透明,然而这样就出现了问题。调试结果的问题如下,
窗口并不出现,消息循环中如果使用了GetMessage(),那么将永远不返回,使得消息循环停滞,如果使用peekMessage 则反回0,使得程序直接退出了。 请问我该如果跟改,才能让程序响应WM_CREATE 消息。
...全文
653 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuliao0419 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ringphone 的回复:]
不对,CreateWindowEx的参数错了,第2个参数是窗口类名,应该是你注册的类名"Weixin2003"而不是什么"WinSunProc"。
[/Quote]
非常感谢,我怎么就傻擦了 写了窗口过程函数的名字了!!!
Eleven 2011-08-04
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include<string>
#include <time.h>
using namespace std;
#define WS_EX_LAYERED 0x80000
typedef BOOL (WINAPI*FPT)(HWND,int,BOOL,DWORD);
FPT fp;
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName= _T("Weixin2003");
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);

HWND hwnd;
hwnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED|WS_EX_TOOLWINDOW, _T("Weixin2003"),NULL,WS_POPUP|WS_SYSMENU,
0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HMODULE hsad=LoadLibrary(_T("user32.dll"));
HDC hdc;
TCHAR str[]= _T("I love You");
switch(uMsg)
{
case WM_CREATE:

fp=(FPT)GetProcAddress(hsad,"SetLayeredWindowAttributes");
FreeLibrary(hsad);
fp(hwnd,RGB(255,255,255),200,3);
MessageBox(hwnd,_T(""),_T(""),MB_OK);
SetTimer(hwnd,1,1000,NULL);
break;
case WM_TIMER:

hdc = GetDC(hwnd);
TextOut(hdc,rand()%GetSystemMetrics(SM_CXSCREEN),rand()%GetSystemMetrics(SM_CYSCREEN),str,_tcslen(str));
ReleaseDC(hwnd, hdc);
break;

case WM_CHAR:
TCHAR szChar[20];
_stprintf(szChar, _T("char is %d"),wParam);
MessageBox(hwnd,szChar, _T("weixin"),0);
break;
case WM_LBUTTONDOWN:
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,_T("计算机编程语言培训"),_tcslen(_T("计算机编程语言培训")));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0, _T("维新培训"),_tcslen(_T("维新培训")));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd, _T("是否真的结束?"), _T("weixin"),MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
ringphone 2011-08-04
  • 打赏
  • 举报
回复
不对,CreateWindowEx的参数错了,第2个参数是窗口类名,应该是你注册的类名"Weixin2003"而不是什么"WinSunProc"。
ringphone 2011-08-04
  • 打赏
  • 举报
回复
或许是WS_EX_LAYERED的关系,试试去掉这个创建,然后在WM_CREATE里面SetWindowLong再把这个类型加进去。
shuxieweilai 2011-08-04
  • 打赏
  • 举报
回复
不懂 帮顶
ancillar 2011-08-04
  • 打赏
  • 举报
回复
你应该先确信窗体已经被正确的创建了,即窗口句柄不为空。
wuliao0419 2011-08-03
  • 打赏
  • 举报
回复
没人明白吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧