process icon

Update LunaHost.cpp
This commit is contained in:
恍兮惚兮 2024-02-11 23:49:11 +08:00
parent dee56c4dba
commit c306ac0280
9 changed files with 155 additions and 32 deletions

View File

@ -57,7 +57,7 @@
#define MenuRemovePlugin L"移除插件" #define MenuRemovePlugin L"移除插件"
#define MenuPluginRankUp L"上移" #define MenuPluginRankUp L"上移"
#define MenuPluginRankDown L"下移" #define MenuPluginRankDown L"下移"
#define DefaultFont L"" #define DefaultFont L"微软雅黑"
#define InVaildPlugin L"无效的插件" #define InVaildPlugin L"无效的插件"
#define CantLoadQtLoader L"无法加载QtLoader.dll" #define CantLoadQtLoader L"无法加载QtLoader.dll"
#define LblPluginNotify L"依赖于Qt的插件仅会在启动时载入。" #define LblPluginNotify L"依赖于Qt的插件仅会在启动时载入。"

View File

@ -1,5 +1,5 @@
add_executable(LunaHost WIN32 confighelper.cpp controls.cpp main.cpp processlistwindow.cpp LunaHost.cpp window.cpp luna.rc pluginmanager.cpp Plugin/pluginexample.cpp app.manifest) add_executable(LunaHost WIN32 confighelper.cpp controls.cpp main.cpp processlistwindow.cpp LunaHost.cpp window.cpp luna.rc pluginmanager.cpp Plugin/pluginexample.cpp app.manifest)
target_precompile_headers(LunaHost REUSE_FROM pch) target_precompile_headers(LunaHost REUSE_FROM pch)
set_target_properties(LunaHost PROPERTIES OUTPUT_NAME "LunaHost${bitappendix}") set_target_properties(LunaHost PROPERTIES OUTPUT_NAME "LunaHost${bitappendix}")
target_link_libraries(LunaHost pch host ${YY_Thunks_for_WinXP}) target_link_libraries(LunaHost comctl32 pch host ${YY_Thunks_for_WinXP})
add_subdirectory(Plugin) add_subdirectory(Plugin)

View File

@ -33,18 +33,21 @@ void LunaHost::on_close(){
Sleep(100); Sleep(100);
} }
void LunaHost::on_size(int w,int h){ void LunaHost::on_size(int w,int h){
int height = h-140; int height = h-110;
w-=20; w-=20;
g_selectprocessbutton->setgeo(10,10,w/3,40); auto _w=w-20;
btnshowsettionwindow->setgeo(10+w/3,10,w/3,40); g_selectprocessbutton->setgeo(10,10,_w/3,30);
btnplugin->setgeo(10+w*2/3,10,w/3,40); btnshowsettionwindow->setgeo(10+10+_w/3,10,_w/3,30);
g_hListBox_listtext->setgeo(10, 110, w , height/2); btnplugin->setgeo(10+20+_w*2/3,10,_w/3,30);
g_showtexts->setgeo(10, 120+height/2, w , height/2); g_hListBox_listtext->setgeo(10, 90, w , height/2);
g_hEdit_userhook->setgeo(10,60,w*2/3,40); g_showtexts->setgeo(10, 100+height/2, w , height/2);
g_hButton_insert->setgeo(10+w*2/3,60,w/3,40); g_hEdit_userhook->setgeo(10,50,_w*2/3+10,30);
g_hButton_insert->setgeo(10+20+_w*2/3,50,_w/3,30);
} }
LunaHost::LunaHost(){ LunaHost::LunaHost(){
setfont(25);
configs=new confighelper; configs=new confighelper;
settext(WndLunaHostGui); settext(WndLunaHostGui);
btnshowsettionwindow=new button(this, BtnShowSettingWindow,100,100,100,100); btnshowsettionwindow=new button(this, BtnShowSettingWindow,100,100,100,100);
@ -138,7 +141,6 @@ LunaHost::LunaHost(){
std::bind(&LunaHost::on_text_recv,this,std::placeholders::_1,std::placeholders::_2) std::bind(&LunaHost::on_text_recv,this,std::placeholders::_1,std::placeholders::_2)
); );
setfont(25);
setcentral(1000,600); setcentral(1000,600);
} }
@ -181,9 +183,9 @@ void LunaHost::on_thread_delete(TextThread& thread){
} }
Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){
new label(this,LblFlushDelay,10, 10, 150, 40); new label(this,LblFlushDelay,10, 10, 150, 30);
new label(this,LblCodePage,10, 60, 150, 40); new label(this,LblCodePage,10, 50, 150, 30);
ckbfilterrepeat=new checkbox(this,LblFilterRepeat,10, 160, 200, 40); ckbfilterrepeat=new checkbox(this,LblFilterRepeat,10, 130, 200, 30);
ckbfilterrepeat->onclick=[=](){ ckbfilterrepeat->onclick=[=](){
auto ck=ckbfilterrepeat->ischecked(); auto ck=ckbfilterrepeat->ischecked();
TextThread::filterRepetition=ck; TextThread::filterRepetition=ck;
@ -191,7 +193,7 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){
}; };
ckbfilterrepeat->setcheck(host->configs->get("filterrepeat",false)); ckbfilterrepeat->setcheck(host->configs->get("filterrepeat",false));
g_check_clipboard =new checkbox(this,BtnToClipboard,10, 110, 200, 40) ; g_check_clipboard =new checkbox(this,BtnToClipboard,10, 90, 200, 30) ;
g_check_clipboard->onclick=[=](){ g_check_clipboard->onclick=[=](){
auto ck=g_check_clipboard->ischecked(); auto ck=g_check_clipboard->ischecked();
((LunaHost*)parent)->check_toclipboard=ck; ((LunaHost*)parent)->check_toclipboard=ck;
@ -199,8 +201,8 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){
}; };
g_check_clipboard->setcheck(host->configs->get("ToClipboard",false)); g_check_clipboard->setcheck(host->configs->get("ToClipboard",false));
g_timeout = new spinbox(this,std::to_wstring(host->configs->get("flushDelay",TextThread::flushDelay)).c_str(),160, 10, 100, 40) ; g_timeout = new spinbox(this,std::to_wstring(host->configs->get("flushDelay",TextThread::flushDelay)).c_str(),150, 10, 100, 30) ;
g_codepage = new spinbox(this,std::to_wstring(host->configs->get("codepage",Host::defaultCodepage)).c_str(),160, 60, 100, 40) ; g_codepage = new spinbox(this,std::to_wstring(host->configs->get("codepage",Host::defaultCodepage)).c_str(),150, 50, 100, 30) ;
g_timeout->onvaluechange=[=](int v){ g_timeout->onvaluechange=[=](int v){
TextThread::flushDelay=v; TextThread::flushDelay=v;
host->configs->set("flushDelay",v); host->configs->set("flushDelay",v);
@ -213,11 +215,11 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){
} }
}; };
g_codepage->setminmax(0,CP_UTF8); g_codepage->setminmax(0,CP_UTF8);
setcentral(300,300); setcentral(300,240);
settext(WndSetting); settext(WndSetting);
} }
void Pluginwindow::on_size(int w,int h){ void Pluginwindow::on_size(int w,int h){
listplugins->setgeo(10,80,w-20,h-100); listplugins->setgeo(10,80,w-20,h-90);
} }
Pluginwindow::Pluginwindow(mainwindow*p,Pluginmanager* pl):mainwindow(p){ Pluginwindow::Pluginwindow(mainwindow*p,Pluginmanager* pl):mainwindow(p){
pluginmanager=pl; pluginmanager=pl;

View File

@ -1,13 +1,13 @@
#include"controls.h" #include"controls.h"
#include"window.h" #include"window.h"
#include <CommCtrl.h>
control::control(mainwindow*_parent){ control::control(mainwindow*_parent){
parent=_parent; parent=_parent;
parent->controls.push_back(this); parent->controls.push_back(this);
} }
void control::dispatch(WPARAM){} void control::dispatch(WPARAM){}
void control::dispatch_2(WPARAM wParam, LPARAM lParam){};
button::button(mainwindow* parent,LPCWSTR text,int x,int y,int w,int h,DWORD style):control(parent){ button::button(mainwindow* parent,LPCWSTR text,int x,int y,int w,int h,DWORD style):control(parent){
winId=CreateWindowEx(0, L"BUTTON", text, WS_CHILD | WS_VISIBLE |style , winId=CreateWindowEx(0, L"BUTTON", text, WS_CHILD | WS_VISIBLE |style ,
x, y, w, h, parent->winId , NULL, NULL, NULL); x, y, w, h, parent->winId , NULL, NULL, NULL);
@ -139,3 +139,74 @@ int listbox::count(){
int listbox::insertitem(int i,LPCWSTR t){ int listbox::insertitem(int i,LPCWSTR t){
return SendMessage(winId, LB_INSERTSTRING, i, (LPARAM)t); return SendMessage(winId, LB_INSERTSTRING, i, (LPARAM)t);
} }
listview::listview(mainwindow* parent,int x,int y,int w,int h):control(parent){
winId=CreateWindowEx(0, WC_LISTVIEW, NULL, WS_VISIBLE |WS_VSCROLL| WS_CHILD | LVS_REPORT |LVS_SINGLESEL, x, y, w, h, parent->winId, NULL,NULL, NULL);
ListView_SetExtendedListViewStyle(winId, LVS_EX_FULLROWSELECT); // Set extended styles
setfont(22);
hImageList = ImageList_Create(22,22, //GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
ILC_COLOR32, 1 ,1);
ListView_SetImageList(winId, hImageList, LVSIL_SMALL);
}
int listview::insertcol(int i,const std::wstring& text){
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = const_cast<LPWSTR>(text.c_str());
//lvc.cx = 100;
return ListView_InsertColumn(winId, i, &lvc);
}
int listview::insertitem(int row,const std::wstring& text,HICON hicon){
LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE;
lvi.pszText = const_cast<LPWSTR>(text.c_str());
lvi.iItem = row;
lvi.iSubItem = 0;
lvi.iImage = ImageList_AddIcon(hImageList, hicon);
return ListView_InsertItem(winId, &lvi);
}
int listview::additem(const std::wstring& text,HICON hicon){
return insertitem(count(),text,hicon);
}
void listview::clear(){
ListView_DeleteAllItems(winId);
}
int listview::count(){
return ListView_GetItemCount(winId);
}
void listview::dispatch_2(WPARAM wParam, LPARAM lParam){
NMHDR* pnmhdr = (NMHDR*)lParam;
switch (pnmhdr->code){
case LVN_ITEMCHANGED:
{
NMLISTVIEW* pnmListView = (NMLISTVIEW*)lParam;
if ((pnmListView->uChanged & LVIF_STATE) && (pnmListView->uNewState & LVIS_SELECTED))
{
oncurrentchange(pnmListView->iItem);
}
break;
}
}
}
std::wstring listview::text(int row,int col){
std::wstring text;text.resize(65535);
LV_ITEM _macro_lvi;
_macro_lvi.iSubItem = (col);
_macro_lvi.cchTextMax = (65535);
_macro_lvi.pszText = (text.data());
SNDMSG((winId), LVM_GETITEMTEXT, (WPARAM)(row), (LPARAM)(LV_ITEM *)&_macro_lvi);
return text.c_str();
}
void listview::setheader(const std::vector<std::wstring>& headers){
for(int i=0;i<headers.size();i++){
insertcol(i,headers[i]);
ListView_SetColumnWidth(winId, i, LVSCW_AUTOSIZE_USEHEADER);
}
headernum=headers.size();
}
void listview::autosize(){
for(int i=0;i<headernum;i++){
ListView_SetColumnWidth(winId, i, LVSCW_AUTOSIZE_USEHEADER);
}
}

View File

@ -1,12 +1,13 @@
#ifndef LUNA_BASE_CONTROLS_H #ifndef LUNA_BASE_CONTROLS_H
#define LUNA_BASE_CONTROLS_H #define LUNA_BASE_CONTROLS_H
#include"window.h" #include"window.h"
#include <CommCtrl.h>
class control:public basewindow{ class control:public basewindow{
public: public:
mainwindow* parent; mainwindow* parent;
control(mainwindow*); control(mainwindow*);
virtual void dispatch(WPARAM); virtual void dispatch(WPARAM);
virtual void dispatch_2(WPARAM wParam, LPARAM lParam);
std::function<HMENU()>oncontextmenu=[](){return (HMENU)nullptr;}; std::function<HMENU()>oncontextmenu=[](){return (HMENU)nullptr;};
std::function<void(WPARAM)>oncontextmenucallback=[](WPARAM){}; std::function<void(WPARAM)>oncontextmenucallback=[](WPARAM){};
}; };
@ -62,4 +63,20 @@ public:
LONG_PTR getdata(int); LONG_PTR getdata(int);
int count(); int count();
}; };
class listview:public control{
int headernum=1;
HIMAGELIST hImageList;
public:
listview(mainwindow*,int,int,int,int);
int insertitem(int,const std::wstring&,HICON hicon);
int insertcol(int,const std::wstring& );
void clear();
int count();
std::function<void(int)> oncurrentchange=[](int){};
std::wstring text(int,int=0);
void setheader(const std::vector<std::wstring>&);
void autosize();
int additem(const std::wstring&,HICON hicon);
void listview::dispatch_2(WPARAM wParam, LPARAM lParam);
};
#endif #endif

View File

@ -4,6 +4,7 @@
#include"host.h" #include"host.h"
#include"processlistwindow.h" #include"processlistwindow.h"
#include"Lang/Lang.h" #include"Lang/Lang.h"
#include<shellapi.h>
std::unordered_map<std::wstring,std::vector<int>> getprocesslist() std::unordered_map<std::wstring,std::vector<int>> getprocesslist()
{ {
std::unordered_map<std::wstring,std::vector<int>>exe_pid; std::unordered_map<std::wstring,std::vector<int>>exe_pid;
@ -42,17 +43,20 @@ std::unordered_map<std::wstring,std::vector<int>> getprocesslist()
} }
return exe_pid; return exe_pid;
} }
void processlistwindow::PopulateProcessList(listbox* _listbox,std::unordered_map<std::wstring,std::vector<int>>&exe_pid){
void processlistwindow::PopulateProcessList(listview* _listbox,std::unordered_map<std::wstring,std::vector<int>>&exe_pid){
_listbox->clear(); _listbox->clear();
for(auto& exe:exe_pid){ for(auto& exe:exe_pid){
_listbox->additem(exe.first.c_str()); auto hicon=GetExeIcon(exe.first.c_str());
_listbox->additem(exe.first.c_str(),hicon);
DestroyIcon(hicon);
} }
} }
processlistwindow::processlistwindow(mainwindow* p):mainwindow(p){ processlistwindow::processlistwindow(mainwindow* p):mainwindow(p){
g_hEdit = new textedit(this,L"",10, 10, 400, 40,ES_AUTOHSCROLL); g_hEdit = new textedit(this,L"",10, 10, 400, 30,ES_AUTOHSCROLL);
g_hButton=new button(this,BtnAttach,420, 10, 100, 40); g_hButton=new button(this,BtnAttach,420, 10, 100, 30);
g_refreshbutton =new button(this,BtnRefresh,530, 10, 100, 40); g_refreshbutton =new button(this,BtnRefresh,530, 10, 100, 30);
g_hButton->onclick=[&](){ g_hButton->onclick=[&](){
auto str=g_hEdit->text(); auto str=g_hEdit->text();
if(str.size()){ if(str.size()){
@ -72,7 +76,8 @@ processlistwindow::processlistwindow(mainwindow* p):mainwindow(p){
g_exe_pid=getprocesslist(); g_exe_pid=getprocesslist();
PopulateProcessList(g_hListBox,g_exe_pid); PopulateProcessList(g_hListBox,g_exe_pid);
}; };
g_hListBox = new listbox(this,10, 60, 310, 200); g_hListBox = new listview(this,10, 60, 310, 200);
g_hListBox->setheader({L""});
g_hListBox->oncurrentchange=[&](int idx){ g_hListBox->oncurrentchange=[&](int idx){
auto pids=g_exe_pid[g_hListBox->text(idx)]; auto pids=g_exe_pid[g_hListBox->text(idx)];
@ -94,5 +99,11 @@ void processlistwindow::on_show(){
PopulateProcessList(g_hListBox,g_exe_pid); PopulateProcessList(g_hListBox,g_exe_pid);
} }
void processlistwindow::on_size(int w,int h){ void processlistwindow::on_size(int w,int h){
g_hListBox->setgeo(10,60,w-20,h-70); w=w-20;
auto _w=w-20;
g_hEdit->setgeo(10,10,_w/2,30);
g_hButton->setgeo(10+_w/2+10,10,_w/4,30);
g_refreshbutton->setgeo(10+_w/2+_w/4+20,10,_w/4,30);
g_hListBox->setgeo(10,50,w,h-60);
g_hListBox->autosize();
} }

View File

@ -5,10 +5,10 @@
class processlistwindow:public mainwindow{ class processlistwindow:public mainwindow{
textedit* g_hEdit; textedit* g_hEdit;
button* g_hButton; button* g_hButton;
listbox* g_hListBox; listview* g_hListBox;
button* g_refreshbutton; button* g_refreshbutton;
std::unordered_map<std::wstring,std::vector<int>> g_exe_pid; std::unordered_map<std::wstring,std::vector<int>> g_exe_pid;
void PopulateProcessList(listbox*,std::unordered_map<std::wstring,std::vector<int>>&); void PopulateProcessList(listview*,std::unordered_map<std::wstring,std::vector<int>>&);
public: public:
processlistwindow(mainwindow* parent=0); processlistwindow(mainwindow* parent=0);
void on_size(int w,int h); void on_size(int w,int h);

View File

@ -1,6 +1,15 @@
#include"window.h" #include"window.h"
#include"controls.h" #include"controls.h"
#include"Lang/Lang.h" #include"Lang/Lang.h"
#include<shellapi.h>
HICON GetExeIcon(const wchar_t* filePath) {
SHFILEINFO fileInfo;
HICON hIcon = NULL;
if (SHGetFileInfo(filePath, 0, &fileInfo, sizeof(fileInfo), SHGFI_ICON | SHGFI_LARGEICON)) {
hIcon = fileInfo.hIcon;
}
return hIcon;
}
void basewindow::setfont(int sz,LPCWSTR fn){ void basewindow::setfont(int sz,LPCWSTR fn){
if(fn==0)fn=DefaultFont; if(fn==0)fn=DefaultFont;
hfont=CreateFont(sz, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, hfont=CreateFont(sz, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
@ -51,6 +60,17 @@ LRESULT mainwindow::wndproc(UINT message, WPARAM wParam, LPARAM lParam){
on_size(width,height); on_size(width,height);
break; break;
} }
case WM_NOTIFY:
{
NMHDR* pnmhdr = (NMHDR*)lParam;
for(auto ctl:controls)
{
if(pnmhdr->hwndFrom==ctl->winId)
{
ctl->dispatch_2(wParam,lParam);break;
}
}
}
case WM_COMMAND: case WM_COMMAND:
{ {
if(lParam==0){ if(lParam==0){
@ -133,7 +153,8 @@ mainwindow::mainwindow(mainwindow* _parent){
wc.hInstance = GetModuleHandle(0); wc.hInstance = GetModuleHandle(0);
wc.lpszClassName = CLASS_NAME; wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW ); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW );
wc.hIcon=LoadIconW(GetModuleHandle(0),L"IDI_ICON1"); wc.hIcon= GetExeIcon(GetModuleFilename().value().c_str());//LoadIconW(GetModuleHandle(0),L"IDI_ICON1");
static auto _=RegisterClass(&wc); static auto _=RegisterClass(&wc);
HWND hWnd = CreateWindowEx( HWND hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,CLASS_NAME,CLASS_NAME,WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE,CLASS_NAME,CLASS_NAME,WS_OVERLAPPEDWINDOW,

View File

@ -28,4 +28,5 @@ public:
void setcentral(int,int); void setcentral(int,int);
std::pair<int,int>calculateXY(int w,int h); std::pair<int,int>calculateXY(int w,int h);
}; };
HICON GetExeIcon(const wchar_t* filePath);
#endif #endif