Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот тебе кусок мего кода из подобной программки
Код:
          case WM_RBUTTONDOWN:
               GetCursorPos(&curPos);
               SetForegroundWindow(hWnd);
               retCmd=TrackPopupMenu(hMenu, TPM_RETURNCMD, curPos.x, curPos.y,
                                     0, hWnd, NULL);
               switch(retCmd)
               {
                case IDM_DISABLE:
                     if(GetMenuState(hMenu, IDM_DISABLE, MF_BYCOMMAND) &
                        MF_CHECKED)
                     {
                      CheckMenuItem(hMenu, IDM_DISABLE,
                                    MF_BYCOMMAND | MF_UNCHECKED);
                      nid.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(ICON_1));
                     }
                     else
                     {
                      CheckMenuItem(hMenu, IDM_DISABLE,
                                    MF_BYCOMMAND | MF_CHECKED);
                      nid.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(ICON_2));
                     }
                     nid.uFlags=NIF_ICON;
                     Shell_NotifyIcon(NIM_MODIFY, &nid);
                     break;
                case IDM_ABOUT:
                     if(!abouting)
                     {
                      DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_1), NULL,
                                reinterpret_cast<DLGPROC>(aboutProc));
                      abouting=0;
                     }
                     else SetForegroundWindow(abouting);
                     break;
                case IDM_CONFIGURE:
                     if(!configuring)
                     {
                      DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_2), NULL,
                                reinterpret_cast<DLGPROC>(configProc));
                      configuring=0;
                     }
                     else SetForegroundWindow(configuring);
                     break;
                case IDM_QUIT:
                     DestroyWindow(hWnd);
                     break;
                default:
                     break;
               }
               return DefWindowProc(hWnd, uMsg, wParam, lParam);
Как видишь, всё работает. Разница разве что в том, что меню у меня создаётся один раз и до конца программы (здесь не показано). Надо твой код смотреть.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 14:06 18-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а у тебя меню в resource файле ?
наверное я тоже попробую сделать в ресорсе и посмотрю.. может заработает...
 
добавлено:
 
УУУУРРАААА !!!!
получилось !
огромное спасибо за помощь !!!!!!!
 

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 15:56 18-06-2007 | Исправлено: plazzmex, 17:10 18-06-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Нет, меню создавалось програмно. Но один раз при старте.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 13:54 19-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Нет, меню создавалось програмно. Но один раз при старте.

как ? в WM_CREATE ???

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 14:28 19-06-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Именно. Если вызывать TrackPopupMenu(), то меню может быть "свободным", т.е. не указываться ни к какому классу окна. TrackPopupMenu() работает сама по себе, и при необходимости hwnd можно указать прям в её вызове.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 22:22 19-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Именно. Если вызывать TrackPopupMenu(), то меню может быть "свободным", т.е. не указываться ни к какому классу окна. TrackPopupMenu() работает сама по себе, и при необходимости hwnd можно указать прям в её вызове.

аа.. понятно.
спасибо за помощь
 
Добавлено:
есть еще маленький вопрос..
по записи в реестр.
я разные настройки сохраняю в реестр и все работает а вот в Run реестра не получилось.. точнее запись идет но программа не запускается при старте виндовса..
а если запускается то сразу удаляется из реестра хотя ключ я записывал не в RunOnce а Run !
 
вот код:

Код:
 
case ID_CONTEXT_AUTORUN:
{
HKEY hIndAutoRun;
SECURITY_ATTRIBUTES sa = {sizeof(sa), 0,1};
DWORD state = 0;
RegCreateKeyEx (HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, &sa, &hIndAutoRun, &state );
GetCurrentDirectory (MAX_PATH + 1, szBuffer)  
if (SearchPath(szBuffer, "Autorunp.exe", NULL, MAX_PATH + 1, szFile, (LPTSTR*) &_FileName) == 0)
{
            MessageBox(hwnd, "The File name was changed! The Autorun function is disabled now!\n\nTo enable it rename the file back to - 'Autorunp.exe'", "File Name Was Changed !", MB_OK | MB_ICONWARNING);
}
else
{
            RegSetValueEx(hIndAutoRun, "autorunp", 0, REG_SZ, (LPBYTE) szFile, sizeof(szFile) );
}
RegCloseKey(hIndAutoRun);
}
break;
 

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 23:19 20-06-2007 | Исправлено: plazzmex, 13:08 21-06-2007
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот так примерно

Код:
 
procedure SetAutoRun(AutoRun:boolean);
var
   Key          :HKEY;
   ValType      WORD;
   Size,Res     WORD;
   Path         :String;
begin
   Path:='Software\Microsoft\Windows\CurrentVersion\Run';
   if RegOpenKeyEx(HKEY_CURRENT_USER,PChar(Path),0,KEY_SET_VALUE,Key)<> ERROR_SUCCESS then
     RegCreateKeyEx(HKEY_CURRENT_USER,PChar(Path),0,nil,0,KEY_SET_VALUE,nil,Key,@Res);
   ValType:=REG_SZ;
   Size:=Length(ParamStr(0));
   if AutoRun then RegSetValueEx(Key,'KeyFiller',0,ValType,PChar(ParamStr(0)),Size)
      else RegDeleteValue(Key,'KeyFiller');
   RegCloseKey(Key);
end;
 

знакомые ошибки, после попытки создания не проверяем код возврата, а просто пытаемся куда нить писать данные, так как твое  

Цитата:
RegCreateKeyEx (HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, &sa, &hIndAutoRun, &state );

пытается создать секцию, причем с полным доступом, а есть он у тебя или нет - хз.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 21-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
а это на с++ ?
а то я не знаю с++ (я знаю с)
и спасибо.. попробую.

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 13:02 21-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ничего не получилось ..
где можно найти, или может у когото есть пример программы на С и WinApi которая записывается в Autorun реестра?
 
помогите пожалуйста
 
добавленно:
ой.. а почему оно не прикрепило это сообщение кпрошлому?

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 22:11 21-06-2007 | Исправлено: plazzmex, 22:15 21-06-2007
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
plazzmex
у меня такой код работает (компилируется MinGW):

Код:
 
#define STRICT
#include <windows.h>
 
static char *AutoLoadKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
 
char *GetExePath(void)
    {
    char *program;
 
    program=malloc(MAX_PATH);
    if(NULL==program)
        return NULL;
    if(0==GetModuleFileName(NULL, program, MAX_PATH))
        {
        free(program);
        return NULL;
        }
    return program;
    }
 
void AddAutoLoad(char *name)
    {
    HKEY key;
    DWORD action;
    char *program;
 
    program=GetExePath();
    if(NULL==program)
        return;
       
    if(ERROR_SUCCESS==RegCreateKeyEx(HKEY_CURRENT_USER, AutoLoadKey,
            0, NULL,  REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
            &key, &action)
        )
        {
        RegSetValueEx(key, name, 0,
            REG_SZ, (LPBYTE)program, lstrlen(program)+1);
        RegCloseKey(key);
        }
    free(program);
    }
 
int main(void)
    {
    AddAutoLoad("my_autorun");
    return 0;
    }
 

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 23:16 21-06-2007
plazzmex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vjunk
спасибо..

Цитата:
у меня такой код работает

но..., он при загрузки виндовса после загрузки программы сразу удаляется из реестра !
почему ?

Всего записей: 1123 | Зарегистр. 29-09-2005 | Отправлено: 19:04 22-06-2007
Lyrik

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
plazzmex
а попробуй вручную создать ключ, через регедит, например, и перезагрузить. он удалится или нет? может у тя стоят какие-то ограничения.

Всего записей: 388 | Зарегистр. 04-04-2006 | Отправлено: 00:02 23-06-2007
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
plazzmex
Какой-то антивирус/файервол/вирус/адваре/спайваре у тебя чистит реестр.
Разбирайся со своей системой.
Можешь в VMware поставить чистую винду без доп. программ и там проверить.
Кстати, ты уверен, что это не твоя-же программа после загрузки по ошибке удаляет ключ?

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 23:51 24-06-2007
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я пишу Shell Extension для Explorer, это dll, и у меня имеется необходимость загрузить из этой dll панель диалога. Для этого надо указать hInstance моей загруженной dll. Но я никак не могу ее определить, и даже не могу определить полный путь, по которому она лежит на диске! GetModulwFileName(NULL,...) дает explorer.exe, если брать hInstance из WINAPI DllMain(HINSTANCE hInstance, ... , то опять дает explorer.exe.
Как бы решить такую проблему? Т.е. определить либо hInstance, либо полный путь к dll, которая является Shell Extension.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 15:53 05-07-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
HINSTANCE, соответствующий твоей длл-ке передается в DllMain:

Код:
 
BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,
  DWORD fdwReason,
  LPVOID lpvReserved
);
 

 
Чтобы определить путь попробуй вызвать GetModulwFileName с соотв HINSTANCE

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 16:29 05-07-2007
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это я попробовал:

Цитата:
если брать hInstance из WINAPI DllMain(HINSTANCE hInstance, ... , то опять дает explorer.exe

не получилось.
Тут вроде нарыл способ - через VirtualQuery, вроде работает, но как-то слишком мудрено.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 16:36 05-07-2007
RedLord

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
 
заведи статическую переменную в dll
возьми ее адрес и выравняй его  или    
попробуй GetModuleHandleEx (флаг - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS. она позволяет получить по адресу внутри модуля)

Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 17:48 05-07-2007
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С VirtualQuery идея та же. Там берется статическая переменная или функция, скармливается ее адрес и получается потом HInstance.

Цитата:
 
static int DUMMY;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(&DUMMY, &mbi, sizeof(mbi));
(HMODULE)mbi.AllocationBase; // то, что надо
 

Спасибо за помощь! Давно на чистом API ничего не писал, немного растерялся ...

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 18:01 05-07-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
Специально попробовал:
Код в Длл

Код:
 
static HANDLE glhModule;
 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
                       DWORD  ul_reason_for_call,  
                       LPVOID lpReserved
                     )
{
    glhModule = hModule;
    return TRUE;
}
 
 
...
//экспортируемая функция
    
    TCHAR fn[MAX_PATH];
    
    GetModuleFileName((HINSTANCE)glhModule, fn, MAX_PATH);
    MessageBox(0, fn, NULL, MB_OK);
 

 
Показывает путь к длл

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 18:24 05-07-2007 | Исправлено: vshersh, 18:26 05-07-2007
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo

Цитата:
С VirtualQuery идея та же. Там берется статическая переменная или функция, скармливается ее адрес и получается потом HInstance.

А есть ещё GetMappedFileName, которой можно скормить адрес и получить имя файла.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:39 05-07-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru