托盘程序问题,如何获得当前鼠标的屏幕坐标?

cchon 2004-04-04 10:41:59
我的这段程序,鼠标的x坐标取的好象不对!

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HINSTANCE hInstance;
static HMENU popMenu,hMenu;
static POINT pt;
char buff[50];

switch(msg)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_TRAY_MENU));
popMenu=GetSubMenu(hMenu,0);
return 0;
case WM_COMMAND:

switch(LOWORD(wParam))
{
case IDM_ABOUT_DIALOG:
DialogBox (hInstance, MAKEINTRESOURCE(IDD_TESTTRAY_DIALOG), hwnd, AboutDlgProc) ;
return 0;
case IDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
return 0;
}
return 0;
case WM_LBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
wsprintf(buff,"x is %d",pt.x);
MessageBox(NULL,buff,"",MB_OK);
return 0;

case WM_SIZE:
if(wParam==SIZE_MINIMIZED)
{
myTray.hWnd=hwnd; //把当前窗口加到SysTray
myTray.AddIcon();
ShowWindow(hwnd,SW_HIDE);
}
return 0;

case TRAY_NOTIFYICON: //NOTIFYICONDATA.uCallbackMessage
switch(lParam)
{
case WM_RBUTTONDOWN:
pt.x=LOWORD(lParam);
//pt.y=HIWORD(lParam);
ClientToScreen(hwnd,&pt);
/*这一句:menu 没有显示在鼠标的当前位置*/
TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
return 0;
case WM_LBUTTONDBLCLK:
myTray.DeleteIcon();
ShowWindow(hwnd,SW_SHOW);
return 0;
}
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
...全文
68 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
legend-never-die 2004-04-05
  • 打赏
  • 举报
回复
先使用GetCursorPos()得到当前鼠标位置,然后再调用TrackPopupMenu

我就是这么做的呀
gjd111686 2004-04-05
  • 打赏
  • 举报
回复
LRESULT CQQDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONUP:
{
CMenu m_Menu;
if(m_Menu.LoadMenu(IDR_MENU))
{
CMenu* pPop=m_Menu.GetSubMenu(0);
CPoint m_Point;
if(IsWindowVisible())
m_Menu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"隐藏");
else
m_Menu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"显示");
if(bStatus)
{
m_Menu.ModifyMenu(IDC_STATUS,MF_STRING,IDC_STATUS,"禁用");
}
else
{
m_Menu.ModifyMenu(IDC_STATUS,MF_STRING,IDC_STATUS,"启动");
}
GetCursorPos(&m_Point);
SetForegroundWindow();
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,m_Point.x,m_Point.y,this);
}
}
break;
case WM_LBUTTONDOWN:
{
OnShow();
}
break;
}
return 0;
}
cchon 2004-04-05
  • 打赏
  • 举报
回复
我想知道这样做为什么不正确:

case WM_RBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
ClientToScreen(hwnd,&pt);
/*这一句:menu 没有显示在鼠标的当前位置*/
TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
return 0;
cchon 2004-04-05
  • 打赏
  • 举报
回复
我想知道这样做为什么不正确,这一段程序有什么问题:

case WM_RBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
ClientToScreen(hwnd,&pt);
/*这一句:menu 没有显示在鼠标的当前位置*/
TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
return 0;

cchon 2004-04-04
  • 打赏
  • 举报
回复
case WM_RBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
ClientToScreen(hwnd,&pt);
/*这一句:menu 没有显示在鼠标的当前位置*/
TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
return 0;

其实我加了ClientToScreen(hwnd,&pt),还是不正确!
oldforest 2004-04-04
  • 打赏
  • 举报
回复
case WM_LBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
ClientToScreen(&pt); // 加上这句
wsprintf(buff,"x is %d",pt.x);
MessageBox(NULL,buff,"",MB_OK);
return 0;
oldforest 2004-04-04
  • 打赏
  • 举报
回复
case WM_LBUTTONDOWN:
ClientToScreen(&pt); // 加上这句
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
wsprintf(buff,"x is %d",pt.x);
MessageBox(NULL,buff,"",MB_OK);
return 0;
薛定谔之死猫 2004-04-04
  • 打赏
  • 举报
回复
SDK下
POINT pos;
GetCursorPos(&pos);
薛定谔之死猫 2004-04-04
  • 打赏
  • 举报
回复
CPoint pos;
GetCursorPos(&pos);
这几天没事做,研究了下Delphi的托盘编程 。现在很多程序都用这个,比如傲游,迅雷,==,很方便。主要代码如下: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI, AppEvnts, StdCtrls, Menus; const WM_NID = WM_User + 1000; //声明一个常量 private { Private declarations } // 定义两个函数 procedure SysCommand(var SysMsg: TMessage); message WM_SYSCOMMAND; procedure WMNID(var msg:TMessage); message WM_NID; public end; var Form1: TForm1; NotifyIcon: TNotifyIconData; // 全局变量 implementation {$R *.dfm} procedure TForm1.WMNID(var msg:TMessage); var mousepos: TPoint; begin GetCursorPos(mousepos); //获取鼠标位置 case msg.LParam of WM_LBUTTONUP: // 在托盘区点击左键后 begin Form1.Visible := not Form1.Visible; // 显示主窗体与否 Shell_NotifyIcon(NIM_DELETE, @NotifyIcon); // 显示主窗体后删除托盘区的图标 SetWindowPos(Application.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW); // 在任务栏显示程序 end; WM_RBUTTONUP: PopupMenu1.Popup(mousepos.X, mousepos.Y); // 弹出菜单 end; end; procedure TForm1.FormDestroy(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @NotifyIcon); // 删除托盘图标 end; procedure TForm1.SysCommand(var SysMsg: TMessage); begin case SysMsg.WParam of SC_MINIMIZE: // 当最小化时 begin SetWindowPos(Application.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_HIDEWINDOW); Hide; // 在任务栏隐藏程序 // 在托盘区显示图标 with NotifyIcon do begin cbSize := SizeOf(TNotifyIconData); Wnd := Handle; uID := 1; uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallBackMessage := WM_NID; hIcon := Application.Icon.Handle; szTip := '托盘程序'; end; Shell_NotifyIcon(NIM_ADD, @NotifyIcon); // 在托盘区显示图标 end; else inherited; end; end; {以下三个函数为托盘右键菜单,可自行添加功能} procedure TForm1.N1Click(Sender: TObject); begin ShowMessage('Delphi托盘程序,Code by Zero Zhang'); end; procedure TForm1.N2Click(Sender: TObject); begin Form1.Visible := true; // 显示窗体 SetWindowPos(Application.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW); Shell_NotifyIcon(NIM_DELETE, @NotifyIcon); // 删除托盘图标 end; procedure TForm1.N3Click(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @NotifyIcon); Application.Terminate; end; end.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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