Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: Abs62
Дата сообщения: 27.01.2006 07:20
AdskiCorel

Цитата:
Возможно можно как-то принудительно изменить клиентскую область главного окна?

Именно принудительно это и делается. Только не клиентскую область, а размеры окна-администратора (Client window). Примерно так:

Код:
void ResizeClientWindow(HWND hwnd)
{
RECT r;
int n;
if(hToolBar==NULL) return;
if(IsIconic(hwnd)) return;
GetWindowRect(hToolBar,&r);
n=r.bottom-r.top;
GetClientRect(hwnd,&r);
MoveWindow(hClientWindow,r.left,r.top+n,r.right-r.left,
r.bottom-r.top-n,TRUE);
}
Автор: AdskiCorel
Дата сообщения: 28.01.2006 12:33
Все заработало . Спасибо большое Abs62.

Единственное хочу уточнить( вдруг еще какой-то ламер вроде меня зайдет с этим же вопросм) Эту функцию нужно применять при WM_SIZE в окнной процедуре ClientWindow, а не FrameWindow(как я по началу пытался), для чего нужно перехватывать его оконную процедуру.
Автор: Abs62
Дата сообщения: 28.01.2006 16:14
AdskiCorel
Хм. У меня эта функция стоит именно в оконной процедуре FrameWindow, и всё нормально работает. Ведь по идее, размер ClientWindow жёстко связан с размером FrameWindow. Лезть в оконную процедуру ClientWindow надо, если его размер может изменяться при неизменном размере FrameWindow. За счёт чего такое может происходить? Размер клиентской области FrameWindow меняется?

PS. И не стоит смешивать понятия "ламер" и "чайник" - это две большие разницы.
Автор: ItsJustMe
Дата сообщения: 29.01.2006 02:29
DeADMoHAX

Цитата:
это у них просто в голове каша. В названии функции же сказано - в флоат, а не в даубл

А ты сам-то в math.h заглядывал? Видимо, отсутствие этой самой каши в голове является непреодолимым препятствием для умения читать.
Автор: dan2k5
Дата сообщения: 03.02.2006 09:11
Народ, подскажите как...
...сделать multiline edit типа notepad'овского, чтобы при нажатии Enter курсор переходил на новую строку? Посмотрел какой стиль у edit'а в notepad, сделал себе так же - не робит.

...растягивать контрол при растягивании окна? есть такой код:

Код:
//
case WM_SIZING:
hList = GetDlgItem(hWnd, IDC_LISTBOX1);
// и дальше мудим с размерами ListBox'а
SetWindowPos(...);
Автор: ItsJustMe
Дата сообщения: 03.02.2006 11:49
1. Создаешь EDIT со следующими стилями: ES_MULTILINE, ES_WANTRETURN.
2. Насчет моргает, не знаю, не проверял, а вот GetDlgItem вызывать каждый раз не обязательно. Сделай hList глобальной и инициализируй ее при CreateWindow и юзай на здоровье. Handle в процессе работы проги не поменяется
Автор: dan2k5
Дата сообщения: 03.02.2006 12:39
ItsJustMe
ES_WANTRETURN помог, спасибо.
Насчет плохих хэндлов - это быд мой глюк.

Еще один вопросик (раз вы такие умные ) - работа с SysListView32, а именно: добавление items. Есть ListView с 2 столбцами, в первом имя файла, во втором - CRC32.
В первый столбец item добавляется, а во второй нет

Код:
    lvi.iSubItem = 0;
    lvi.pszText = szFile;
    SendDlgItemMessage(hWnd, IDC_LV, LVM_INSERTITEM, 0, &lvi)
//bla-bla-bla
    ...
//
    lvi.pszText = szCRCBuf;
    lvi.iSubItem = 1;
    SendDlgItemMessage(hWnd, IDC_LV, LVM_INSERTITEM, 0, &lvi)
Автор: Lightpower
Дата сообщения: 03.02.2006 14:13
Как программно записать данные на CD? Кто-нибудь знает?
Или где можно это найти?
Автор: dyr farot
Дата сообщения: 03.02.2006 15:57
писать можно или через микрософтовский IMAPI:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/imapi/imapi/imapi_reference.asp
или через Nero SDK:
http://ww2.nero.com/nero6/enu/SDK_API.html
http://sourceforge.net/projects/delphineroapi/
Автор: Lightpower
Дата сообщения: 03.02.2006 16:13
Dyr Farot, спасибо, исчерпывающий ответ!
Разобрался, всё получилось
Автор: Abs62
Дата сообщения: 03.02.2006 19:13
dan2k5

Цитата:
В первый столбец item добавляется, а во второй нет

И не будет так добавляться. Ибо в MSDN английским по белому написано:

You cannot use ListView_InsertItem or LVM_INSERTITEM to insert subitems. The iSubItem member of the LVITEM structure must be zero. See LVM_SETITEM for information on setting subitems.


Автор: Sept
Дата сообщения: 10.02.2006 14:17
Здорова всем кого не видел, может мне оказать помошь добрейший человек изо всех сдешних добряков? Вобщем хочу НАУЧИТСЯ создавать формы и кнопочки на них при помоши winapi
Автор: XPEHOMETP
Дата сообщения: 10.02.2006 14:33
Проблема в чем: кроме форм и кнопочек еще нужна так называемая оконная функция, в которую Windows посылают сообщения, что такая-то кнопочка нажата, или что форму наглый юзер хочет закрыть, кликнув по крестику в углу. Или что надо пререрисовать всю форму, если на нее вдруг налезло окно другой проги, а потом его убрали. То есть формы и кнопочки - не самое страшное, даже в виде ресурса можно присобачить, а вот обработка системных сообщений - это морока. И даже самый добрый из всех добряков этому так запросто не научит.
Автор: Abs62
Дата сообщения: 10.02.2006 18:31
Sept
Берёшь книжку Ч. Петцольда "Программирование под Windows" и разбираешься потихоньку. Для начала - самое то.
Автор: Sept
Дата сообщения: 11.02.2006 17:48
Abs62
XPEHOMETP
сеньк вери мач, почитаю на досуге, а мона примерчики несложные на мыльце?
Автор: Abs62
Дата сообщения: 11.02.2006 18:29
Sept
А примерчики там же, в книге. Начиная с "Hello, Windows".
Автор: Sept
Дата сообщения: 11.02.2006 18:33
ссылка есть?
Автор: Abs62
Дата сообщения: 11.02.2006 18:45
Sept
Угу. Тут должна лежать.
Кстати, на этом сайте ещё и другие хорошие книжки есть.
Автор: Sept
Дата сообщения: 11.02.2006 18:48
большой сеньк за сайтик, полезненько будет его must'нуть read'нуть....
Автор: dan2k5
Дата сообщения: 11.02.2006 20:31
Пишу программу для клавиатуры, она обрабатывает дополнительные кнопки
play, stop, pause, volume down, volume up, www, email etc.
Реализовано все это с помощью хуков. Проблема вот в чем - на некоторые кнопки уже windows навесила свои программы, например, при нажатии на кнопку www запускается браузер, как сделать так, чтобы windows не обрабатывала эти кнопки?
Автор: Sept
Дата сообщения: 11.02.2006 21:09
найди прогу для полноценного мониторинга системы, удали браузер и посмотри, что винда, а главное куда пишет... на мой взгляд это реально осуществить
Автор: dan2k5
Дата сообщения: 11.02.2006 21:42
Sept

Нееее, твой способ мне не подходит.
Как быть тогда с кнопками volume up и volume down.
Windows изменяет громкость на 4 пункта, а мне надо, например, на 2?
Автор: Mindless
Дата сообщения: 12.02.2006 00:35
dan2k5
ну насколько я помню, в процедуре обработки хука ызывается дальше цепочка хуков обычно, так ты её просто не вызывай. Вроде так.
Автор: Abs62
Дата сообщения: 12.02.2006 01:07
dan2k5
А какой хук вешаешь? WH_SHELL или WH_CALLWNDPROC?
Автор: dan2k5
Дата сообщения: 12.02.2006 09:07
Abs62
WH_KEYBOARD_LL

Mindless
Не катит, уже пробовал.

вот кусок моего кода:
написан правда на ассемблере, но используюся все те же API-функции.

LowLevelKeyboardProc proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM

    cmp nCode, 0                            ;если nCode < 0, то вызываем CallNextHookEx
    jl q
    
    mov esi, lParam
    assume esi: ptr KBDLLHOOKSTRUCT

    mov eax, [esi].flags
    cmp al, 1                                ;если 1 то клавиша отпущена, 0 - нажата
    je q

    mov eax, [esi].vkCode
    shl eax, 8                                ;в ax заношу virtual-key code
    mov ebx, [esi].scanCode
    mov al, bl                                ;в al заношу hardware scan code
    
    assume esi: nothing

    .if eax == 0ff23h
        lea eax, [lpFile]
        invoke ShellExecute, NULL, offset szOpen, eax, NULL, NULL, SW_SHOW
    .endif

q:    invoke CallNextHookEx, hKbHook, nCode, wParam, lParam
    ret
LowLevelKeyboardProc endp
Автор: Abs62
Дата сообщения: 12.02.2006 15:43
dan2k5

Цитата:
mov eax, [esi].flags
cmp al, 1 ;если 1 то клавиша отпущена, 0 - нажата
je q

1. Младший бит в flags - это не признак нажатия клавиши, это extended-key flag. Лучше пользуй константу LLKHF_UP - не прошибёшься.
2. Битовые поля проверяются не командой cmp, а командой test.


Цитата:
q: invoke CallNextHookEx, hKbHook, nCode, wParam, lParam
ret

Если ты передаёшь сообщение дальше по цепочке, не удивляйся, что его после тебя обрабатывает кто-то ещё. Ибо "If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure". (C) MSDN.
Обработал сам - верни (-1), дабы никто более посягал на обработку.

И ещё. Не упускай из виду следующее:

Цитата:
The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:

HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure does not return during this interval, the system will pass the message to the next hook.


PS. А чем WH_SHELL не устраивает?
Автор: react
Дата сообщения: 12.02.2006 18:05
Привет всем !

Помгоите решить проблемку. Я написал программу, которая автоматически нажимает на определенную кнопку в другой программе, все бы хорошо, только когда юзер делает Screen Lock моя програмка напрочь отказывается работать и ждет пока юзер разблокирует экран ...

Код выглядит примерно так:


Код:
HWND saveButton = FindWindowEx(wnd, NULL, NULL, "&Save");
SendMessage(saveButton, (UINT) BM_CLICK, (WPARAM) 0, (LPARAM) 0);
Автор: Abs62
Дата сообщения: 12.02.2006 20:13
react
1. Можно вместо SendMessage использовать PostMessage - тогда твоя программа не заблокируется. Правда, и другая не отреагирует до снятия блокировки.
2. Можно попробовать сразу отослать BN_CLICKED родителю кнопки. Примерно так:

Код:
HWND saveButton = FindWindowEx(wnd, NULL, NULL, "&Save");
HWND hParent=GetParent(saveButton);
WORD n=(WORD)GetDlgCtrlID(saveButton);
if(0!=n) {
SendMessage(hParent,WM_COMMAND,MAKEWPARAM(n,BN_CLICKED),(LPARAM)saveButton);
}
Автор: dan2k5
Дата сообщения: 12.02.2006 22:19
Abs62


Цитата:
Лучше пользуй константу LLKHF_UP

Можешь объяснить, как? LLKHF_UP = 80h


Цитата:
Обработал сам - верни (-1), дабы никто более посягал на обработку.

Обработал, вернул -1, при нажатии на кнопку www работает мод код и все равно запускается браузер

С WH_SHELL попробую. Спасибо.
Автор: Abs62
Дата сообщения: 13.02.2006 00:30
dan2k5

Цитата:
Можешь объяснить, как? LLKHF_UP = 80h

Обыкновенно. Примерно так:

Код:
mov eax, [esi].flags
test eax,LLKHF_UP
jz KEY_WAS_PRESSED ; 0 в 7 бите - клавиша нажата
... ; Код, отрабатываемый при отпускания клавиши
jmp COMMON_CODE
KEY_WAS_PRESSED:
... ; Код, отрабатываемый при нажатии клавиши
COMMON_CODE:
... ; Код , отрабатываемый во всех случаях

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.