Подавить взаимодействие с рабочим столом Windows
От: Cynic Россия  
Дата: 03.10.16 15:30
Оценка:
Подскажите, возможно ли как-то средствами Framework или WIN-API подавить взаимодействие программы с рабочим столом (чтоб она ни какие окна не показывала, но продолжала работать). На компе на котором нужно это сделать я администратор, так что привилегий хватит на всё. Софтина в нормальном состоянии висит в трее, но любит показывать всякие всплывающие окошки и от этого нужно как-то избавиться. Софтина сторонняя, доступа к исходникам нет.
:)
Re: Подавить взаимодействие с рабочим столом Windows
От: Sinix  
Дата: 03.10.16 15:49
Оценка:
Здравствуйте, Cynic, Вы писали:

C> На компе на котором нужно это сделать я администратор, так что привилегий хватит на всё. Софтина в нормальном состоянии висит в трее, но любит показывать всякие всплывающие окошки и от этого нужно как-то избавиться.

https://autohotkey.com/docs/commands/WinActive.htm#IfWinActive__IfWinNotActive__WinActive
+
https://autohotkey.com/docs/commands/WinHide.htm
?
Ну, или мониторить все окна процесса и посылать ShowWindow(handle, SW_HIDE)

Но я бы купил / поменял бы на альтернативу / написал бы автору.
Re: Подавить взаимодействие с рабочим столом Windows
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.10.16 15:54
Оценка:
Здравствуйте, Cynic, Вы писали:

C>Подскажите, возможно ли как-то средствами Framework или WIN-API подавить взаимодействие программы с рабочим столом (чтоб она ни какие окна не показывала, но продолжала работать). На компе на котором нужно это сделать я администратор, так что привилегий хватит на всё. Софтина в нормальном состоянии висит в трее, но любит показывать всякие всплывающие окошки и от этого нужно как-то избавиться. Софтина сторонняя, доступа к исходникам нет.


Повесь софтиту как сервис и не дай ему привилегию общения с гуи.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Подавить взаимодействие с рабочим столом Windows
От: Cynic Россия  
Дата: 03.10.16 18:02
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну, или мониторить все окна процесса и посылать ShowWindow(handle, SW_HIDE)

S>Но я бы купил / поменял бы на альтернативу / написал бы автору.

А нельзя просто сделать все окна процесса не видимыми?
:)
Re[3]: Подавить взаимодействие с рабочим столом Windows
От: Sinix  
Дата: 03.10.16 19:56
Оценка:
Здравствуйте, Cynic, Вы писали:

C>А нельзя просто сделать все окна процесса не видимыми?


Можно конечно — перебираем все открытые окна процесса и скрываем. Разумеется, процессу никто не мешает проверить состояние своих окон и отобразить их повторно, так что придётся повторить. И так пока пользователю не надоест и он не убъёт оба процесса.

Не, можно ещё попытать счастья с virtual desktops, но уведомления в трее так не скроешь, да и дело это малодокументированное.

Или поискать что-то типа такого, если вас конечно не смущает запускать с админскими правами код с домена securityxploded. Хотя что-то в этом есть, да.
Re: Подавить взаимодействие с рабочим столом Windows
От: kov_serg Россия  
Дата: 03.10.16 23:21
Оценка: 10 (1) +1
Здравствуйте, Cynic, Вы писали:

C>Подскажите, возможно ли как-то средствами Framework или WIN-API подавить взаимодействие программы с рабочим столом (чтоб она ни какие окна не показывала, но продолжала работать). На компе на котором нужно это сделать я администратор, так что привилегий хватит на всё. Софтина в нормальном состоянии висит в трее, но любит показывать всякие всплывающие окошки и от этого нужно как-то избавиться. Софтина сторонняя, доступа к исходникам нет.

Нефиг делать https://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

bool Desktop_SwitchTo(const char* name,bool *first_time) {
    PSECURITY_DESCRIPTOR sd;//ULONG sd_size;
    HANDLE desktop; DWORD flags;
    LPWSTR device;LPDEVMODEW devmode;
    ACCESS_MASK  desired_access; LPSECURITY_ATTRIBUTES  sa;
    BOOL SaclPresent,SaclDefaulted; PACL Sacl;BOOL res;
    BOOL create_new=TRUE; DWORD err;

    enum { wname_size=128 }; wchar_t wname[wname_size+1];
    int n=MultiByteToWideChar(CP_UTF8,0,name,strlen(name),wname,wname_size); wname[n]=0;

    device=0;devmode=0;flags=0;desired_access=0x10000000;sa=0;
    desktop=CreateDesktopW(wname,device,devmode,flags,desired_access,sa);
    if (desktop) {
        sd=0;
        res=ConvertStringSecurityDescriptorToSecurityDescriptorW(L"S:(ML;;NW;;;LW)",SDDL_REVISION_1,&sd,0);
        if (res) {
            res=GetSecurityDescriptorSacl(sd, &SaclPresent, &Sacl, &SaclDefaulted);
            if (res) {
                 SetSecurityInfo(desktop,SE_WINDOW_OBJECT,LABEL_SECURITY_INFORMATION,0,0,0,Sacl);
            }
            LocalFree(sd);
        }
    } else {
        err=GetLastError();
        create_new=FALSE;
        desktop=OpenDesktopW(wname,flags,FALSE,desired_access);
        if (!desktop) { 
            if (error) error(error_ctx,"no desktop error=%d\n", GetLastError());
        }
    }
    if (desktop) {
        SwitchDesktop((HDESK)desktop);
        SetThreadDesktop((HDESK)desktop);
    }
    if (first_time) *first_time=!!create_new;
    return !!desktop;
}
bool Desktop_StartProcess(const char* desktop_name,const char* app,const char* cmd) {
    BOOL res,ingeritHandles;DWORD creatFlags; 
    STARTUPINFOA si; PROCESS_INFORMATION pi;
    char *env,*curdir;
    env=0; curdir=0;
    memset(&si,0,sizeof(si));
    memset(&pi,0,sizeof(pi));
    si.cb=sizeof(si);
    si.lpDesktop=(char*)desktop_name;
    ingeritHandles=FALSE;
    creatFlags=0;
    res=CreateProcessA(app,(char*)cmd,0,0,ingeritHandles,creatFlags,env,curdir,&si,&pi);
    //if (res) WaitForSingleObject(pi.hProcess,INFINITE);
    return res ? 1 : 0;
}

Создаёшь ей декктоп и на нём стартуй пусть она там окна рисует. Но вот если она задумает звуки издавать тут уж держитесь.
Re[2]: Подавить взаимодействие с рабочим столом Windows
От: Слава  
Дата: 03.10.16 23:37
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Создаёшь ей декктоп и на нём стартуй пусть она там окна рисует. Но вот если она задумает звуки издавать тут уж держитесь.


Поддерживаю, сам делал невидимую прогу таким способом. Но, остается вопрос о трее, надо экспериментировать.
Re[2]: Подавить взаимодействие с рабочим столом Windows
От: Cynic Россия  
Дата: 04.10.16 08:05
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Нефиг делать https://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

_>Создаёшь ей десктоп и на нём стартуй пусть она там окна рисует. Но вот если она задумает звуки издавать тут уж держитесь.

Мне тут сразщу два момента не понятно:
  1. Создаёшь ей десктоп и на нём стартуй пусть она там окна рисует. В смысле создаешь десктоп? Как? Какой софтине? Код которой вы привели?
  2. Что будет есои фотина захочет всё таки поиздавать звуки?
И кстати сцылка не работает
:)
Отредактировано 04.10.2016 8:08 Cynic . Предыдущая версия .
Re: Подавить взаимодействие с рабочим столом Windows
От: namespace  
Дата: 04.10.16 15:35
Оценка:
C>Подскажите, возможно ли как-то средствами Framework или WIN-API подавить взаимодействие программы с рабочим столом (чтоб она ни какие окна не показывала, но продолжала работать).
— Попробовать запускать софтину из собственной оболочки с StartInfo.CreateNoWindow
— Искать окно(удачно, если оно создается один раз) свою прогой и 1. отправлять за пределы экрана, 2. делать прозрачным, 3. уменьшать размер радикально,... нарисовать свою картинку
Spy++ из утилит MS VS в помощь.
Re[3]: Подавить взаимодействие с рабочим столом Windows
От: kov_serg Россия  
Дата: 04.10.16 21:03
Оценка: 6 (1)
Здравствуйте, Cynic, Вы писали:

C>Здравствуйте, kov_serg, Вы писали:


_>>Нефиг делать https://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

_>>Создаёшь ей десктоп и на нём стартуй пусть она там окна рисует. Но вот если она задумает звуки издавать тут уж держитесь.

C>Мне тут сразщу два момента не понятно:

C> Создаёшь ей десктоп и на нём стартуй пусть она там окна рисует. В смысле создаешь десктоп? Как? Какой софтине? Код которой вы привели?
есть прога sysinternals desktops ей можно поиграться
вот рыба для такого сценария
// desktop.cpp
// 
//   desktop run backdesk c:\anoing-installer-app.exe "a b c"
//   desktop explorer backdesk
//   desktop switch default
//
// compile from visual studio command prompt
//   cl desktop.cpp user32.lib advapi32.lib
//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <sddl.h>
#include <accctrl.h>
#include <aclapi.h>
#define snprintf _snprintf
#define stricmp  _stricmp

bool Desktop_Find(const char* desktop) {
    struct CB {    bool find; const char* desktop;
        static BOOL CALLBACK proc(LPSTR name, LPARAM prm) { CB* cb=(CB*)prm;
            if (stricmp(name,cb->desktop)==0) { cb->find=true; return FALSE; }
            return TRUE;
        }
    } cb;
    cb.find=false;
    cb.desktop=desktop;
    HWINSTA ws=GetProcessWindowStation();
    EnumDesktopsA(ws,CB::proc,(LPARAM)&cb);
    return cb.find;
}
bool Desktop_SwitchTo(const char* name,bool switch_to=true) {
    PSECURITY_DESCRIPTOR sd; HANDLE desktop; DWORD flags;
    LPWSTR device;LPDEVMODEW devmode; ACCESS_MASK desired_access; LPSECURITY_ATTRIBUTES  sa;
    BOOL SaclPresent,SaclDefaulted; PACL Sacl;BOOL res; BOOL create_new=TRUE; DWORD err;
    enum { wname_size=MAX_PATH }; wchar_t wname[wname_size+1];
    int n=MultiByteToWideChar(CP_UTF8,0,name,strlen(name),wname,wname_size); wname[n]=0;
    device=0;devmode=0;flags=0;desired_access=0x10000000;sa=0;
    desktop=CreateDesktopW(wname,device,devmode,flags,desired_access,sa);
    if (desktop) {
        sd=0;
        res=ConvertStringSecurityDescriptorToSecurityDescriptorW(L"S:(ML;;NW;;;LW)",SDDL_REVISION_1,&sd,0);
        if (res) {
            res=GetSecurityDescriptorSacl(sd, &SaclPresent, &Sacl, &SaclDefaulted);
            if (res) SetSecurityInfo(desktop,SE_WINDOW_OBJECT,LABEL_SECURITY_INFORMATION,0,0,0,Sacl);
            if (sd) LocalFree(sd);
        }
    } else {
        err=GetLastError();
        fprintf(stderr,"no desktop error=%d\n", err);
    }
    if (desktop && switch_to) {
        SwitchDesktop((HDESK)desktop);
        SetThreadDesktop((HDESK)desktop);
    }
    return !!desktop;
}

bool Desktop_StartProcess(const char* desktop_name,const char* app,const char* cmd) {
    BOOL res,ingeritHandles;DWORD creatFlags; 
    STARTUPINFOA si; PROCESS_INFORMATION pi;
    char *env,*curdir;
    env=0; curdir=0;
    memset(&si,0,sizeof(si));
    memset(&pi,0,sizeof(pi));
    si.cb=sizeof(si);
    si.lpDesktop=(char*)desktop_name;
    ingeritHandles=FALSE;
    creatFlags=0;
    res=CreateProcessA(app,(char*)cmd,0,0,ingeritHandles,creatFlags,env,curdir,&si,&pi);
    return res ? 1 : 0;
}
void Desktop_explorer(const char* desktop) {
    char* sysroot=getenv("SystemRoot");
    enum { buf_max=MAX_PATH }; char buf[buf_max+1];
    snprintf(buf,buf_max,"%s\\explorer.exe",sysroot);
    Desktop_StartProcess(desktop,buf,sysroot);
}
int usage() {
    fprintf(stdout,
        "usage: app verb opts\n"
        "  verbs:\n"
        "    run desktop app\n"
        "    find desktop\n"
        "    explorer desktop\n"
        "    switch desktop\n"
        "      default - name of default desktop\n"
    );
    return 1;
}
int run(int n,char** args) {
    bool first=false;
    if (n<1) { fprintf(stderr,"need desktop name\n"); return 1; }
    if (n<2) { fprintf(stderr,"need app path\n"); return 1; }
    char *desktop=args[0];
    return Desktop_StartProcess(desktop,args[1],n>2 ? args[2]:"") ? 0 : 1;
}
int switch_desktop(int n,char** args) {
    if (n<1) { fprintf(stderr,"need desktop name\n"); return 1; }
    char *desktop=args[0];
    return Desktop_SwitchTo(desktop,true) ? 0 : 1;
}
int find_desktop(int n,char** args) {
    if (n<1) { fprintf(stderr,"need desktop name\n"); return 1; }
    char *desktop=args[0];    
    bool res=Desktop_Find(desktop);
    if (res) fprintf(stdout,"%s\n",desktop);
    else fprintf(stderr,"no %s\n",desktop);
    return res ? 0 : 1;
}

int main(int argc,char **argv) {
    if (argc>1 && strcmp(argv[1],"run")==0) return run(argc-2,argv+2);
    if (argc>1 && strcmp(argv[1],"switch")==0) return switch_desktop(argc-2,argv+2);
    if (argc>1 && strcmp(argv[1],"find")==0) return find_desktop(argc-2,argv+2);
    if (argc>1 && strcmp(argv[1],"explorer")==0) {
        if (argc>2) Desktop_explorer(argv[2]);
        return switch_desktop(argc-2,argv+2);
    }
    return usage();
}


C>Что будет есои фотина захочет всё таки поиздавать звуки?

Будут слышны звуки.

C>И кстати сцылка не работает

https://technet.microsoft.com/en-us/sysinternals/cc817881.aspx
google sysinternals desktops
если не работает заходи через tor
Re[3]: Подавить взаимодействие с рабочим столом Windows
От: kov_serg Россия  
Дата: 04.10.16 21:06
Оценка:
Здравствуйте, Слава, Вы писали:

С>Поддерживаю, сам делал невидимую прогу таким способом. Но, остается вопрос о трее, надо экспериментировать.

Там вообще нет трея если не запустить explorer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.