void CRDTDlg::OnSystemTrayIcon(WPARAM wp, LPARAM lp)
{
if(lp == RIGHT_CLICK) {
AfxMessageBox("Right Click !");
}
}
System Tray !!!
У меня вот какой вопрос.
Я пишу прогу каторая работает в System Tray и при нажатие на иконку в
System Tray-е мне надо определить координаты курсора а вот как пожалуйста помогите :confused::confused::confused: !!!
Код:
Код:
LRESULT CALLBACK MainProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) {
LRESULT result = 0;
switch (umsg) {
// .....
case WM_SYSTRAYICON: {
switch (lparam) {
case WM_RBUTTONUP: {
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow(hwnd);
TrackPopupMenu(hmenu, 0, pt.x, pt.y, 0, hwnd, NULL);
}
break;
case WM_LBUTTONUP: {
SendMessage(hwnd, WM_COMMAND, ID_MAIN_SHOWHIDE, 0);
}
break;
}
}
break;
// ......
default: result = DefWindowProc(hwnd, umsg, wparam, lparam);
}
return result;
}
LRESULT result = 0;
switch (umsg) {
// .....
case WM_SYSTRAYICON: {
switch (lparam) {
case WM_RBUTTONUP: {
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow(hwnd);
TrackPopupMenu(hmenu, 0, pt.x, pt.y, 0, hwnd, NULL);
}
break;
case WM_LBUTTONUP: {
SendMessage(hwnd, WM_COMMAND, ID_MAIN_SHOWHIDE, 0);
}
break;
}
}
break;
// ......
default: result = DefWindowProc(hwnd, umsg, wparam, lparam);
}
return result;
}
Спасибо !!!
Друзья я создаю проэкт Dialog based и мне надо чтоб он создавался в заданных координатах например int myx = 10; int myy = 50; как зделать ???? Зарание спасибо !!!!
MoveWindow в инициализации диалога
2. Как при работе программы в трее отслеживать например правый клик по десктопу ?
[RIGHT]Зарание спасибо !!![/RIGHT]
если на вскидку то
Код:
int SetOnTop(HWND hwnd, int on) {
int old=(GetWindowLong(hwnd, GWL_EXSTYLE)&(!WS_EX_TOPMOST));
return SetWindowLong(hwnd, GWL_EXSTYLE, (on==0?old:old|WS_EX_TOPMOST));
}
int old=(GetWindowLong(hwnd, GWL_EXSTYLE)&(!WS_EX_TOPMOST));
return SetWindowLong(hwnd, GWL_EXSTYLE, (on==0?old:old|WS_EX_TOPMOST));
}
2. Здесь, скорее всего, поможет только глобальный хук на мышь
Цитата: ViToBrother
1. Как зделать чтобы диалоговое окно появлялось поверх всех окон ?
[RIGHT]Зарание спасибо !!![/RIGHT]
[RIGHT]Зарание спасибо !!![/RIGHT]
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); (логичское сложение"or" в Си кажется заменятемся на "|") - это сделает окно в стиле поверх всех окон.
SetForegroundWindow(hWnd); - просто переместит окно на передний план.
Цитата: max_dark
1. Смотри в сторону SetWindowLong/GWL_EXSTYLE
если на вскидку то
если на вскидку то
Код:
int SetOnTop(HWND hwnd, int on) {
int old=(GetWindowLong(hwnd, GWL_EXSTYLE)&(!WS_EX_TOPMOST));
return SetWindowLong(hwnd, GWL_EXSTYLE, (on==0?old:old|WS_EX_TOPMOST));
}
int old=(GetWindowLong(hwnd, GWL_EXSTYLE)&(!WS_EX_TOPMOST));
return SetWindowLong(hwnd, GWL_EXSTYLE, (on==0?old:old|WS_EX_TOPMOST));
}
Или этот вариант - результат выполнения HWND_TOPMOST именно изменение EX_STYLE
Цитата: ViToBrother
2. Как при работе программы в трее отслеживать например правый клик по десктопу ?
[RIGHT]Зарание спасибо !!![/RIGHT]
Ищи на тему Hook-и.
Или безумный вариант WindowFromPoint() + GetKeyState() (:D), [COLOR="Red"]не[/COLOR] рекомендую, но иногда можно и его использовать.
Опиши зачем тебе это надо, если это то о чем я думаю, то есть гораздо более красивые решения.
Цитата: 0nni
А зачем вообще перехватывать клики по рабочему столу?
Опиши зачем тебе это надо, если это то о чем я думаю, то есть гораздо более красивые решения.
Опиши зачем тебе это надо, если это то о чем я думаю, то есть гораздо более красивые решения.
Уважаемый 0nni у меня прога иконка которой в тоэе и при нажатие на иконку у меня появляется диалог и мне нужно чтобб при нажатие правым кликом на десктоп или другое место этот диалог закрывался !!! :rolleyes:
Код:
#include <windows.h>
#include "..\\shared\\shared.h"
#define XHOOK_API __declspec(dllexport)
extern "C"
{
XHOOK_API void Release(HINSTANCE xmod);
//XHOOK_API LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
XHOOK_API void Init(HINSTANCE xmod);
};
HINSTANCE xmod;
HHOOK xhook;
void OutError()
{
LPVOID lpMsgBuf;
DWORD err=GetLastError();
//if(!err)return;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,NULL);
MessageBox( NULL,(LPTSTR)lpMsgBuf, "Error", MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
SetLastError(0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason==DLL_PROCESS_ATTACH)
{
xmod=hinstDLL;
xhook=0;
if(!xmod)OutError();
}
return TRUE;
}
XHOOK_API void Release(HINSTANCE xmod)
{
UnhookWindowsHookEx(xhook);
}
#define GetMainWindow() FindWindow(wnd_class,wnd_title)
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
WORD umsg;
HWND main=NULL;
if(nCode==HC_ACTION)
{
PMSG msg=(PMSG)lParam;
POINT pt;
switch(msg->message)
{
case WM_MBUTTONDOWN:
case WM_NCMBUTTONDOWN:
msg->message=WM_NULL;
return 0;
case WM_MBUTTONUP:
case WM_NCMBUTTONUP:
GetCursorPos(&pt);
main=GetMainWindow();
if(IsWindow(main))
{
SendMessage(main,msg->message,0,MAKELPARAM(pt.x,pt.y));
msg->message=WM_NULL;
}
return 0;
default: break;
}
}
return CallNextHookEx(xhook,nCode,wParam,lParam);
}
XHOOK_API void Init(HINSTANCE xmod)
{
xhook=SetWindowsHookEx(WH_GETMESSAGE,HookProc,xmod,0);
if(!xhook) {
OutError();
MessageBeep(IDOK);
}
}
#include "..\\shared\\shared.h"
#define XHOOK_API __declspec(dllexport)
extern "C"
{
XHOOK_API void Release(HINSTANCE xmod);
//XHOOK_API LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
XHOOK_API void Init(HINSTANCE xmod);
};
HINSTANCE xmod;
HHOOK xhook;
void OutError()
{
LPVOID lpMsgBuf;
DWORD err=GetLastError();
//if(!err)return;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,NULL);
MessageBox( NULL,(LPTSTR)lpMsgBuf, "Error", MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
SetLastError(0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason==DLL_PROCESS_ATTACH)
{
xmod=hinstDLL;
xhook=0;
if(!xmod)OutError();
}
return TRUE;
}
XHOOK_API void Release(HINSTANCE xmod)
{
UnhookWindowsHookEx(xhook);
}
#define GetMainWindow() FindWindow(wnd_class,wnd_title)
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
WORD umsg;
HWND main=NULL;
if(nCode==HC_ACTION)
{
PMSG msg=(PMSG)lParam;
POINT pt;
switch(msg->message)
{
case WM_MBUTTONDOWN:
case WM_NCMBUTTONDOWN:
msg->message=WM_NULL;
return 0;
case WM_MBUTTONUP:
case WM_NCMBUTTONUP:
GetCursorPos(&pt);
main=GetMainWindow();
if(IsWindow(main))
{
SendMessage(main,msg->message,0,MAKELPARAM(pt.x,pt.y));
msg->message=WM_NULL;
}
return 0;
default: break;
}
}
return CallNextHookEx(xhook,nCode,wParam,lParam);
}
XHOOK_API void Init(HINSTANCE xmod)
{
xhook=SetWindowsHookEx(WH_GETMESSAGE,HookProc,xmod,0);
if(!xhook) {
OutError();
MessageBeep(IDOK);
}
}
Здесь перехватывается нажатия/отпускания средней кнопки мыши и пересылаются в главное окно(т.е. основная обработка проходит в коде самой проги)