Top Banner
Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People
29

Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

Mar 26, 2015

Download

Documents

Amelia Walton
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

Ludwin Feiten

Window Message und PowerBuilder

Ludwin FeitenPower People

Page 2: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 2/29

Ludwin Feiten

Fahrplan

• Motivation• Send Function• Beispiel• Suchen in der Win-API

Help• Beispiel für PB Custom

Events • …

Page 3: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 3/29

Ludwin Feiten

Motivation

• PowerBuilder hat die Send()-Funktion

• Die Informationen darüber sind verstreut und mühsam zu finden.

Page 4: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 4/29

Ludwin Feiten

Window Events

• PowerBuilder ist eine Windows Anwendung

• Windows hat ein Event gesteuertes User Interface, das von PowerBuilder genutzt werden kann.

• Triggern von Events durch senden von Messages an Controls.

• SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );

Page 5: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 5/29

Ludwin Feiten

SendMessage Function

In Windows sind nicht nur Windows “windows” sondern auch fast alle anderen visuellen Control wie Buttons, Scrollbars, Editfields, etc.

Zur Identifizierung gibt es einen handle

Page 6: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 6/29

Ludwin Feiten

Send Function in PowerBuilder

• Send ( handle, message#, lowword, long )– handle: A long whose value is the system handle

of a window (that you have created in PowerBuilder or another application) to which you want to send a message.

– message#: An UnsignedInteger whose value is the system message number of the message you want to send.

– Lowword: A long whose value is the integer value of the message. If this argument is not used by the message, enter 0.

– Long: The long value of the message or a string.

Page 7: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 7/29

Ludwin Feiten

Send Function: Beispiele

• Dieses Statement scrollt das Fenster w_emp eine Seite hoch:

– Send(Handle(w_emp), 277, 2, 0)

• Das folgende Statements click den CommandButton cb_OK:

– Send(Handle(Parent), 273, 0, Handle(cb_OK))

Page 8: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 8/29

Ludwin Feiten

Messages: Wie kann man sie finden?

• windows API help– http://msdn.microsoft. com/library/

• winuser.h– C:\Program Files\Sybase\Shared\

PowerBuilder\cgen\h\nt\winuser.h

Page 9: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 9/29

Ludwin Feiten

Bspl.: Tab out a field

Suchen in der Windows API Hilfe mit– „Key pressed notification“

Führt zu:– „WM_KEYDONW

Page 10: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 10/29

Ludwin Feiten

Syntax WM_KEYDOWN• WM_KEYDOWN• WPARAM wParam

LPARAM lParam

• wParam: Specifies the virtual-key code of the nonsystem key.

• lParam: Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.

• 0-15: Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.

• 16-23: Specifies the scan code. The value depends on the OEM

• 24: Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0,

• 25-28: Reserved; do not use

• 29: Specifies the context code. The value is always 0 for a WM_KEYDOWN message

• 30: Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up

• 31: Specifies the transition state. The value is always zero for a WM_KEYDOWN message

• Return Value: An application should return zero if it processes this message.

• 24: Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0,

• 25-28: Reserved; do not use• 29: Specifies the context code. The value is always

0 for a WM_KEYDOWN message• 30: Specifies the previous key state. The value is 1

if the key is down before the message is sent, or it is zero if the key is up

• 31: Specifies the transition state. The value is always zero for a WM_KEYDOWN message

• Return Value: An application should return zero if it processes this message.

Page 11: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 11/29

Ludwin Feiten

Nächster Schritt

• winuser.h – #define WM_KEYDOWN 0x0100

• hex 0x0100 ist dec 256. (Windows Rechner in Wissenschaftlicher Ansicht)

• wParam muss der ASCII-Code for the Tab-Key sein: Das ist 9.

• lParam ist Null.

• Der Aufruf ist: send(Handle(this), 256,9, long(0,0))

Page 12: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 12/29

Ludwin Feiten

Besp. Scroll a window

Win32 and COM Development >  User Interface >  Windows Shell >  Windows Controls > 

Individual Control Information >  Scroll Bars 

Page 13: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 13/29

Ludwin Feiten

Syntax WM_VSCROLL • WM_VSCROLL

– WPARAM wParam– LPARAM lParam;

• wParam: – The high-order word specifies the

current position of the scroll box if the low-order word is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise, this word is not used.

– The low-order word specifies a scroll bar value that indicates the user's scrolling request. This parameter can be one of the following values.

• SB_BOTTOM: Scrolls to the lower right. • SB_ENDSCROLL: Ends scroll. • SB_LINEDOWN: Scrolls one line down. • SB_LINEUP: Scrolls one line up. • SB_PAGEDOWN: Scrolls one page down. • SB_PAGEUP: Scrolls one page up.

• SB_THUMBPOSITION: The user has dragged the scroll box (thumb) and released the mouse button. The high-order word indicates the position of the scroll box at the end of the drag operation.

• SB_THUMBTRACK: The user is dragging the scroll box. This message is sent repeatedly until the user releases the mouse button. The high-order word indicates the position that the scroll box has been dragged to.

• SB_TOP: Scrolls to the upper left.

• lParam: – If the message is sent by a scroll

bar, this parameter is the handle to the scroll bar control. If the message is not sent by a scroll bar, this parameter is NULL.

Page 14: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 14/29

Ludwin Feiten

Nächster Schritt:

• winuser.h – #define WM_VSCROLL 0x0115

• hex 0x0115 ist dec 277.

• SB_PAGEDOWN ist 3

• lParam ist Null.

• Der Aufruf ist: send(Handle(this), 277,3, long(0,0))

Page 15: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 15/29

Ludwin Feiten

Strategien zur Suche

Suche in: MSDN Home >  MSDN Library >  Win32 and COM Development >  User Interface >  Windows Shell >  Windows Controls

Subtopics:• “General Control Information”• “Individual Control Information”Suche unter:• "Messages" and "Notifications"

Page 16: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 16/29

Ludwin Feiten

Strategien zur Suche

Suche in winusers.hnach brauchbaren

Schlagwörtern.

Mappen von PB-Events auf WN-EventsSuche in spezieller Liste:

-> www.powerpeople.de

Microsoft Word-Dokument

Page 17: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 17/29

Ludwin Feiten

PowerBuilder custom events

• pbm_custom01 event ID maps to wm_user+0• pbm_custom02 event ID maps to wm_user+1, • …• pbm_custom75 event ID to wm_user+74.

• WM_USER is defined in winusers.h:

• #define WM_USER 0x0400 = 1024

Page 18: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 18/29

Ludwin Feiten

Application Ping-Pong

Page 19: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 19/29

Ludwin Feiten

Ping - Pong

• Suche der Instanzen des Programms (Find Instances)

• Schicken eines Pings (Send Ping)• Empfangen des Ping (ue_ping)->

Pong• Empfangen des Pong (ue_pong)

Page 20: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 20/29

Ludwin Feiten

Find Instances• // Original autor: Karl E. Peterson• // Aus VB "geklaut"

• ulong hWndTmp,&•

FindWindowPartial• string lpClassName,&• lpWindowName,&• TitleTmp,&• TitleStart• integer nRet• integer method

• constant integer FWP_STARTSWITH = 1• constant integer FWP_CONTAINS = 0

• constant integer GW_HWNDNEXT = 2

• TitleStart = parent.title// "Application Ping Pong"• mle_windows.text = ""• setnull(lpClassName)• setnull(lpWindowName)

• hWndTmp = FindWindow(lpClassName, lpWindowName)• Do Until hWndTmp = 0• //• // Make sure this window has no parent.• //• If GetParent(hWndTmp) = 0 Then• //• // Retrieve caption text from current window.• //• TitleTmp = Space(256)• nRet = GetWindowText(hWndTmp, TitleTmp,

Len(TitleTmp))

• If nRet > 0 Then• //• // Clean up return string, preparing for• // case-insensitive comparison.• //• TitleTmp = upper(Left(TitleTmp, nRet))• //• // Use appropriate method to determine if• // current window//s caption either starts• // with or contains passed string.• //• CHOOSE Case Method• Case FWP_STARTSWITH• If pos(TitleTmp, upper(TitleStart)) = 1 Then• FindWindowPartial = hWndTmp•

mle_windows.text += TitleTmp + ' HWND: ' + string(FindWindowPartial) + '~r~n'

• //Exit • End If• Case FWP_CONTAINS• If pos(TitleTmp, upper(TitleStart)) > 0 Then• FindWindowPartial = hWndTmp•

mle_windows.text += TitleTmp + ' HWND: ' + string(FindWindowPartial) + '~r~n'

• // Exit • End If• End CHOOSE• End If• End If• //• // Get next window in master window list and continue.• //• hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)• Loop•

Page 21: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 21/29

Ludwin Feiten

Send ping

unsignedlong hndl_me,&hndl_you

hndl_me = handle(parent)hndl_you = long(em_win_handle.text)IF hndl_you > 0 THEN

// Send a ping to pbm_custom01 and transmit my handle and instance number in the params

send (hndl_du, 1024, hndl_ich, il_nummer ) ;ELSE

MessageBox("Oups", em_window.text + " is not running!")

END IF

Page 22: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 22/29

Ludwin Feiten

ue_ping

event ue_ping pbm_custom01Messagebox("Here is window:

"+string(handle(this))," Got a Ping from: " + string (wparam) + " with Instance No. "+string(lparam) )

// Pong to sender of the Ping (Event Id:1025)send (wparam, 1025, handle(this),

il_number ) ;

end event

Page 23: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 23/29

Ludwin Feiten

ue_pong

event ue_ping pbm_custom02Messagebox("Here is window:

"+string(handle(this))," Got the Pong from: " + string (wparam) + " with Instance No. "+string(lparam) )

end event

Page 24: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 24/29

Ludwin Feiten

Starting Syscommands

Start ScreensaverTo start the screen saver write:/*** WM_SYSCOMMAND 0x0112 274** SC_SCREENSAVE 0xF140 61760*/send(handle(This),274,61760,0)

Page 25: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 25/29

Ludwin Feiten

Starting Syscommands

Maximize a frameTo maximize a window when it opens put the following

code into the Open event. CONSTANT Integer WM_SYSCOMMAND = 274CONSTANT UInt SC_MAXIMIZE = 61488//Send(Handle(This), WM_SYSCOMMAND, SC_MAXIMIZE,

0)

Page 26: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 26/29

Ludwin Feiten

Starting Syscommands

CONSTANT Integer WM_SYSCOMMAND = 274

CONSTANT UInt SC_MAXIMIZE = 61488CONSTANT UInt SC_CLOSE = 61536 // 0xF060CONSTANT UInt SC_SCREENSAVE = 61760 // 0xF140 CONSTANT UInt SC_RESTORE = 61728 // 0xF120

CONSTANT UInt SC_MINIMIZE = 61472 // 0xF020

Send(Handle(w_test), WM_SYSCOMMAND, SC_MINIMIZE, long(0,0) )

…………send(Handle(Parent),16,0,0) //Close

Page 27: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 27/29

Ludwin Feiten

Ein Window ohne Titlebar verschieben

Um ein Window ohne Titlebar zu verschieben muss der folgende Code in das mousedown event.

CONSTANT uint WM_NCLBUTTONDOWN = 161CONSTANT uint HTCAPTION = 2Post( Handle( this ), WM_NCLBUTTONDOWN,

HTCAPTION, Long( xpos, ypos ) )

Page 28: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 28/29

Ludwin Feiten

Einige Events …message lowword long

Keyboard WM_KEYDOWN = 256WM_KEYUP = 257

ASCII Value of the nonsystem KeyBackspace

8Tab 9carriage return

13

0

Mouse WM_LBUTTONDBLCLK= 515

MK_LBUTTON0x0001

MK_RBUTTON0x0002

MK_SHIFT0x0004

MK_CONTROL0x0008

MK_MBUTTON0x0010

The low-order word specifies the x-coordinate of the cursor.

The high-order word specifies the y-coordinate of the cursor.

The coordinate is relative to the upper-left corner of the client area.

Slider WM_HSCROLL = 276WM_VSCROLL = 277

SB_LINEUP 0SB_LINELEFT 0SB_LINEDOWN 1SB_LINERIGHT 1SB_PAGEUP 2SB_PAGELEFT 2SB_PAGEDOWN 3SB_PAGERIGHT 3SB_THUMBPOSITION 4SB_THUMBTRACK 5SB_TOP 6SB_LEFT 6SB_BOTTOM 7SB_RIGHT 7SB_ENDSCROLL 8

0

Page 29: Ludwin Feiten Window Message und PowerBuilder Ludwin Feiten Power People.

PBUGGDüsseldorf 26.05.2006

Window Messages und PowerBuilder

Folie 29/29

Ludwin Feiten

Kontakt

Sind noch Fragen offen?

Bei Rückfragen oder Anregungen bitte an:

Ludwin Feiten

Power PeopleInh. Ludwin Feiten

Am Borsigturm 50

D-13507 Berlin

fon +49 (0)30 43032350fax +49 (0)30 43032355

http://www.powerpeople.demailto:[email protected]